sql - 在每行的两个日期之间计数
问题描述
我需要计算 [选定 YearMonth] 的每一行过去 12 个月的 [SALES]。例如,如果选择 202110,我知道在 202110 和 202011 之间我有一次销售,并且 202110 前面的 [HAD SALES] 应该显示 1,但是,如果选择 202008 并且我回顾过去 12 个月,则没有销售并且我的行应该显示 0。
我需要类似下面的语句,但我的语句中没有 where 子句或参数,但我不确定如何将它们放在一起。
SELECT
[SELECTED YEARMONTH],
(COUNT(SALES) FROM TABLE
WHERE [SELECTED YEARMONTH] BETWEEN [SELECTED PREVYEAR] AND [SELECTED YEARMONTH])
FROM
TABLE;
解决方案
试试下面的说法。
请注意,如果有机会,您应该在子句中使用RANGE
而不是ROWS
在子句中,如示例中所示,您的表中某个月份没有行。OVER
中使用的表达式ORDER BY
返回几个月的连续枚举,这对于我们的算法来说是必要的RANGE
。
如果几个月内没有间隔,那么您可以ORDER BY YEARMONTH ROWS BETWEEN 11 PRECEDING AND CURRENT ROW
改用。
SELECT
YEARMONTH
, SUM (SALES) OVER
(
ORDER BY YEARMONTH / 100 * 12 + MOD (YEARMONTH, 100)
RANGE BETWEEN 11 PRECEDING AND CURRENT ROW
) AS SALES
FROM
(
VALUES
(202110, 1)
--, (202109, 1)
, (202108, 1)
, (202107, 1)
, (202106, 1)
, (202105, 1)
, (202104, 1)
, (202103, 1)
, (202102, 1)
, (202101, 1)
, (202012, 1)
, (202011, 1)
, (202010, 1)
, (202009, 1)
, (202008, 1)
) T (YEARMONTH, SALES)
ORDER BY YEARMONTH DESC
年月 | 销售量 |
---|---|
202110 | 11 |
202108 | 12 |
202107 | 12 |
202106 | 11 |
202105 | 10 |
202104 | 9 |
202103 | 8 |
202102 | 7 |
202101 | 6 |
202012 | 5 |
202011 | 4 |
202010 | 3 |
202009 | 2 |
202008 | 1 |
推荐阅读
- typescript - TypeScript 联合类型缺少属性
- python - 雅虎使用 Selenium 登录,缺少点击
- python - Raspberry Pi 3 上模块 libscrc 的 ImportError
- javascript - 如何利用 DOM Create Element 使现有代码更加动态和简洁?
- spring-boot - Kubernetes pods 使用 TCP 连接优雅关闭(Spring boot)
- json - 将列表投射到飞镖中的对象列表中
- sql-server - 带有 SELECT 内部条件的 VIEWS 延迟查询
- apache-kafka - 如何在 Kafka Streams 中实现多个分区的总计数
- python - 晚上空闲时,我的 Flask 应用程序收到奇怪的请求
- python - 重命名:FileNotFoundError:[WinError 2] - 使用栅格