【问题标题】:Custom month numbers that take last 30 days instead of Number of month (SQL Server)过去 30 天而不是月数的自定义月份数字 (SQL Server)
【发布时间】:2023-02-17 00:33:11
【问题描述】:

我正在尝试创建一个滞后函数来返回艺术家当前月份和上个月的流。

我没有返回 2 月与 1 月的流,而是希望函数使用最近 30 天作为当​​月的期间,而前 30 天作为上个月的期间。

我目前使用的查询是这样的:

SELECT
    DATEPART(month, date) AS month,
    artist,

    SUM([Streams]) AS streams,

    LAG(SUM([Streams])) OVER (PARTITION BY artist ORDER BY DATEPART(month, date)) AS previous_month_streams
FROM combined_artist
WHERE date > DATEADD(m, -2, DATEADD(DAY, 2 - DATEPART(WEEKDAY, GETDATE()-7), CAST(GETDATE()-7 AS DATE)))
GROUP BY DATEPART(month, date), artist;

虽然这有效,但它没有提供我需要的数据。这将返回 2 月的流与 1 月的流的总和。 2 月份似乎很低,因为我们在 2 月份只有一周的数据。

我的目标是使用滞后函数从表中的最大日期获取最近 30 天。因此,如果最大日期是 2023 年 2 月 7 日,我希望当前月份包含 2023 年 1 月 7 日至 2023 年 2 月 7 日的数据,而上个月包含 2022 年 12 月 7 日至 2023 年 1 月 7 日的数据。我是考虑创建一个自定义月份日期部分,该部分将从最大日期开始,并为最后 30 天提供月份编号。 (1 月 7 日至 2 月 7 日 2 个,12 月 7 日至 1 月 7 日 1 个...)我不知道该怎么做。这是在 SQL Server 中,出于性能原因,我希望使用滞后函数。

【问题讨论】:

    标签: sql sql-server performance date lag


    【解决方案1】:

    我认为您可以在 group bypartition by 子句中使用类似 datediff(d, date_you_care_about, max_date)/30 的内容。

    基本思想是整数除法向下舍入,所以如果日期之间的差异小于 30,则除以 30 为 0。如果差异 >=30 但小于 60,则除以 30 为 1。依此类推.

    你可以看到一个proof of concept in this Fiddle

    【讨论】:

      猜你喜欢
      • 2015-06-05
      • 1970-01-01
      • 2022-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多