Sql-Server
從重複數據創建漸變維度表
我正在從一個文件接收事務快照數據,它包含重複數據的歷史記錄。目前正試圖在桌子上找到緩慢變化的尺寸
$$ 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
如果假設您的主查詢由於子查詢或我的交叉應用而確實非常非常慢,那麼您可以將查詢分為兩步嗎?
我認為您應該更多地了解您的要求。
一次將更新多少行?
如果這些選定的行在新表中插入/更新,則下次插入發生時不應再次選擇這些行。
你在做什麼?
如果我對您的要求有誤,請告訴我,以便我更正我的答案。