簡體   English   中英

從具有每月條目的表中生成日期跨度

[英]Generating a Date Span from a Table with Monthly Entries

假設我們在SQL Server 2012中有一個看起來像這樣的表:

YYYYMM | Mbr_ID | Product_ID
----------------------------
201501 | 000001 | AA
201502 | 000001 | AA
201503 | 000001 | AB
201504 | 000001 | AA
201505 | 000001 | AA
201506 | 000001 | AA

將有多個成員,他們可能會多次切換產品,但永遠不會在給定的月份內切換。

我希望將其轉換為跨度表,如下所示:

CMonth_Start | CMonth_End | Mbr_ID | Product_ID
-----------------------------------------------
201501       | 201502     | 000001 | AA
201503       | 201503     | 000001 | AB
201504       | 201506     | 000001 | AA

如果嘗試使用MIN(YYYYMM)和MAX(YYYYMM)進行此操作,則只會獲得第一個產品的外部跨度(201501-201506)。 我知道必須有某種方法可以做到這一點,而且我敢肯定這很簡單,但是我現在想不起來。 非常感謝大家的幫助,感謝您的閱讀!

您可以使用以下查詢:

SELECT MIN(YYYYMM) AS CMonth_Start, MAX(YYYYMM) AS CMonth_End, 
       Mbr_ID, Product_ID
FROM (
SELECT Mbr_ID, Mbr_ID, Product_ID,
       ROW_NUMBER() OVER (PARTITION BY Mbr_ID ORDER BY YYYYMM) - 
       ROW_NUMBER() OVER (PARTITION BY Mbr_ID, Product_ID ORDER BY YYYYMM) AS grp
FROM mytable ) AS t
GROUP BY Mbr_ID, Product_ID, grp

grp標識每個Mbr_ID具有相同Product_ID值的連續記錄的切片。 在外部查詢中使用這個領域,我們可以得到MIN / MAXYYYYMMProduct_ID每個值Mbr_ID

要按順序標識相同值的組,可以使用不同的行號:

select mbr_id, product_id, min(yyyymm) as month_start, max(yyyymm) as month_end
from (select t.*,
             (row_number() over (partition by mbr_id order by yyyymm) -
              row_number() over (partition by mbr_id, product_id order by yyyymm)
             ) as grp
      from t
     ) t
group by mbr_id, grp, product_id;

要了解其工作原理,只需運行子查詢以查看grp值是什么樣子。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM