如何在跨两个不同的年份桥接时解决事务ISO_WEEK分区问题



目标:

我想比较不同年份之间表格中的记录,但通过相同的ISO_WEEK

情况:

我的问题是ISO_WEEK有时会在两个不同的年份之间间隔,所以我无法正确拆分年份中的周数。例如,在 2019 年,ISO_WEEK1 的范围从 2018 年 12 月 31 日到 2019 年 1 月 6 日。随后的查询对它们进行了正确分组,但有一个问题除外,即分区将按YEAR然后ISO_WEEK分组,因此不包括 1ISO_WEEK1 的 12 月 31 日。我如何针对此特定日期以及所有未来日期解决此问题?

我的查询:

CREATE TABLE [table]
([id] varchar(50), [transaction_date] Datetime)
INSERT INTO [table]
VALUES
(123, '2018-01-01 05:30:00'),
(456, '2018-12-31 08:30:00'),
(456, '2019-01-01 06:30:00'),
(789, '2019-01-02 11:30:00')
SELECT 
CAST(t.transaction_date AS Date)
,id
,DATEPART(YEAR, t.transaction_date)
,DATEPART(ISO_WEEK, t.transaction_date)
,ROW_NUMBER() 
OVER(PARTITION BY DATEPART(YEAR, transaction_date), DATEPART(ISO_WEEK, transaction_date), id ORDER BY transaction_date) AS week_count
FROM [table] AS t 

因此,如果我想count2019 年的ISO_WEEK1 ,由于我的分区,它将排除 2018 年 12 月 31 日的值。那么如何修改我的查询以包含它呢?

有 -唉 - 没有iso_year日期部分。 你可以用这样的表达式来计算它:

select year(dateadd(week, 1 - datepart(iso_week, transaction_date), transaction_date))

这样做是回到年初,然后增加一周。 根据 ISO 对年份的定义,这将始终在参考年。

编辑:

对于您的查询,我会做:

SELECT CAST(t.transaction_date AS Date), id, v.td_iso_year, v.td_iso_week,
ROW_NUMBER() OVER (PARTITION BY id, td.iso_year ORDER BY transaction_date) AS week_count
FROM [table] t CROSS APPLY
(VALUES (YEAR(DATEADD(WEEK, 1 - DATEPART(iso_week, t.transaction_date), t.transaction_date)),
DATEPART(ISO_WEEK, t.transaction_date) 
)
) v(td_iso_year, td_iso_week);

最新更新