【SQL Server 2012】按倒序存儲“分組統計”結果的臨時表到新建表
程序預先說明:
本文訪問的數據庫是基於存有RDF三元組的開源數據庫Localyago修改的庫,其中只有一個表,表中有五個屬性:主語subject、謂語predict、賓語object、主語的編號subid,賓語的編號objid。每條記錄由(subject,predict,object,subid,objid)組成。其中當賓語為字符型而不是實體時(比如“2011”),編號默認為0。有以下數據表:
程序需求:
- 統計每個主語有多少相關的謂語屬性(每個謂語可有多個賓語),即有多少以該實體作為主語的記錄
- 由於結果非常巨大,所以需要將結果存儲到數據庫中的新建的一個表中,並按倒序存儲
具體過程:
- 統計每個主語的謂詞數目,輸出(主語,主語id和主語屬性數目),按每個主語的屬性數目倒序輸出:
select subject, subid, count(subject) as subprenum from [Localyago].[dbo].[yago] group by subject,subid order by subprenum DESC;
group by實現分組統計,這裏按subject分類,由於我們在select的時候選擇了subject和subid,而select中的字段要麽包含在group by語句裏,要麽被包含在聚合函數裏,所以我們在這裏的group by中也要寫入subid,不然會報錯
order by 是排序,默認從小到大輸出,加上DESC就變成倒序、從大到小輸出
得到如下結果:
2. 將查詢結果的臨時表按subprenum倒序存入新的表中,便於存儲和查詢
最基本的方式:
如果新表不存在
select * into 新表 from 舊表
如果新表不存在
insert into 新表 select * from 舊表
從而有:
select subject, subid, count(subject) as subprenum into Localyago.dbo.subpre from[Localyago].[dbo].[yago] group by subject,subid; order by subprenum;
然後發現雖然我們上一步查詢的結果是有序的,但運行這個之後生成的新表,並沒有按照subprenum排序,順序是亂的。
檢索之後發現這是由於SQL Server自身的局限,如果有特殊需要,要求臨時表裏面的數據有序,則可以通過【創建聚集索引】來解決這個問題。具體請參考博文:https://www.cnblogs.com/kerrycode/p/5172333.html
從而改進代碼如下:
select subject, subid, count(subject) as subprenum into Localyago.dbo.subpre from [Localyago].[dbo].[yago] where 1=0 group by subject,subid; create clustered index inx_subpre on Localyago.dbo.subpre(subprenum DESC);--創建聚集索引,按subprenum倒序排序 insert into Localyago.dbo.subpre select subject, subid, count(subject) as subprenum from [Localyago].[dbo].[yago] where subid !=0 group by subject,subid order by subprenum;
這樣運行之後得到的新表subpre裏的記錄就是按照subprenum倒序排序了
如下:
【SQL Server 2012】按倒序存儲“分組統計”結果的臨時表到新建表