Sql-Server

從重複數據創建漸變維度表

  • December 3, 2018

我正在從一個文件接收事務快照數據,它包含重複數據的歷史記錄。目前正試圖在桌子上找到緩慢變化的尺寸

$$ ProductId $$業務密鑰。存在許多屬性:ProductTitle、Category,這是一個範例表,實際上還有大約 10 個屬性。如何創建產品漸變維度表查詢? 搜尋性能優化方式,如果我有 10 列,不確定 10 列上的 Group By 是否是最佳的

使用 SQL 2016,是否有獲取此數據的功能?我應該使用領先/滯後功能嗎?第一個值/最後一個值?新的分析語法?下面是一個嘗試的查詢。

注意:數據來自包含歷史數據的 1970 年遺留文件系統。

數據:

create table dbo.Product
(
   ProductId int,
   ProductTitle varchar(55),
   ProductCategory varchar(255),
   Loaddate datetime
)

insert into dbo.Product
values 
(1,'Table','ABCD','3/4/2018')
,(1,'Table','ABCD','3/5/2018')
,(1,'Table','ABCD','3/5/2018')
,(1,'Table','ABCD','3/6/2018')
,(1,'Table','XYZ','3/7/2018')
,(1,'Table','XYZ','3/8/2018')
,(1,'Table','XYZ','3/8/2018')
,(1,'Table','XYZ','3/9/2018')
,(1,'Table-Dinner', 'GHI','3/10/2018')
,(1,'Table-Dinner', 'GHI','3/11/2018')
....more data with ProductId =2,3,4, etc

文件中的目前重複數據:

在此處輸入圖像描述

預期輸出:

在此處輸入圖像描述

嘗試查詢

(似乎效率低下,尤其是當有 10 個屬性列時)

select
   product.Productid
   ,product.ProductTitle
   ,product.ProductCategory
   ,min(product.LoadDate) as BeginDate
   ,case when max(product.LoadDate)  = (select max(subproduct.LoadDate) from dbo.Product subproduct where subproduct.productid = product.productid) then '12/31/9999' else max(product.loadDate) end as EndDate
from dbo.Product product
group by Productid, ProductTitle, ProductCategory

如果我有 10 列,不確定 10 列上的 Group By 是否最佳

確實如此,對這麼多列的分組是次優的。但是根據您的數據和要求,沒有其他方法。

Window function with partition比 差Group By

根據我Group by對這些列的理解,獲得正確的輸出是必要的,所以如果你使用視窗函式,那麼你也必須使用這些列Partition by

因此Partition by,因此任何列都更糟,並且您必須像上面的範例一樣使用更多的選擇。

因此,除了子查詢部分之外,您已經在做的幾乎是正確的。

一旦嘗試這個,

SELECT product.productid, 
      product.producttitle, 
      product.productcategory, 
      Min(product.loaddate) AS BeginDate 
      -- ,max(product.LoadDate) as BeginDate1 
      , 
      CASE 
        WHEN Max(product.loaddate) = Max(oa.enddate1) THEN '12/31/9999' 
        ELSE Max(product.loaddate) 
      END                   AS EndDate 
FROM   dbo.product product 
      CROSS apply(SELECT Max(subproduct.loaddate) EndDate1 
                  FROM   dbo.product subproduct 
                  WHERE  subproduct.productid = product.productid)oa 
GROUP  BY productid, 
         producttitle, 
         productcategory 

如果假設您的主查詢由於子查詢或我的交叉應用而確實非常非常慢,那麼您可以將查詢分為兩步嗎?

我認為您應該更多地了解您的要求。

一次將更新多少行?

如果這些選定的行在新表中插入/更新,則下次插入發生時不應再次選擇這些行。

你在做什麼?

如果我對您的要求有誤,請告訴我,以便我更正我的答案。

引用自:https://dba.stackexchange.com/questions/223783