1. 程式人生 > >【SQL Server 2012】按倒序存儲“分組統計”結果的臨時表到新建表

【SQL Server 2012】按倒序存儲“分組統計”結果的臨時表到新建表

lec 訪問 mage 臨時表 聚合函數 ren 查詢 多個 相關

程序預先說明:

本文訪問的數據庫是基於存有RDF三元組的開源數據庫Localyago修改的庫,其中只有一個表,表中有五個屬性:主語subject、謂語predict、賓語object、主語的編號subid,賓語的編號objid。每條記錄由(subject,predict,object,subid,objid)組成。其中當賓語為字符型而不是實體時(比如“2011”),編號默認為0。有以下數據表:

  技術分享圖片

程序需求:

  1. 統計每個主語有多少相關的謂語屬性(每個謂語可有多個賓語),即有多少以該實體作為主語的記錄
  2. 由於結果非常巨大,所以需要將結果存儲到數據庫中的新建的一個表中,並按倒序存儲

具體過程:

  1. 統計每個主語的謂詞數目,輸出(主語,主語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】按倒序存儲“分組統計”結果的臨時表到新建表