sql - T-SQL 运行总和
问题描述
考虑以下形状的表格(wallet, client, date)
, wherewallet
和client
are strings
,并且date
是直到今天的任何日期。假设一个人想要获得今年每个月的唯一客户和客户的运行总和,按钱包和月份分组。我已经尝试了几件事,包括分区,但我就是无法让它正常工作。
结果将是这样的:
+------------+---------+------------+---------+
| Wallet | Unique | Count | Month |
+------------+---------+------------+---------+
| Wallet1 | 2 | 5 | 1 | - For < 01022019
+------------+---------+------------+---------+
| Wallet1 | 3 | 7 | 2 | - For < 01032019
+------------+---------+------------+---------+
等等。我尝试了很多事情,甚至是分区,但我失败了。我只设法把它变成了几个小查询,都在日期下面使用 WHERE,这绝对是糟糕的,.eg
INSERT INTO
tmp_tbl_filtered
SELECT
[Wallet],
COUNT(DISTINCT [Client]) AS [unique],
COUNT([Client]) AS [count],
1 AS [month]
FROM
tmp_tbl
WHERE [Date] < '20190201'
GROUP BY [Wallet]
ORDER BY [Wallet]
INSERT INTO
tmp_tbl_filtered
SELECT
[Wallet],
COUNT(DISTINCT [Client]) AS [unique],
COUNT([Client]) AS [count],
2 AS [month]
FROM
tmp_tbl
WHERE [Date] < '20190301'
GROUP BY [Wallet]
ORDER BY [Wallet]
解决方案
如果我做对了
SELECT [Wallet], [month]
, SUM([unique]) OVER(PARTITION BY [Wallet] ORDER BY [month]) [unique_rt]
, SUM([count]) OVER(PARTITION BY [Wallet] ORDER BY [month]) [count_rt]
FROM (
-- group data of the current year 2019 by wallet and month
SELECT
[Wallet],
DATEPART(month,[Date]) AS [month],
COUNT(DISTINCT [Client]) AS [unique],
COUNT([Client]) AS [count]
FROM
tmp_tbl
WHERE [Date] >= '20190101'
GROUP BY [Wallet], DATEPART(month,[Date])
) t
ORDER BY [Wallet], [month]
推荐阅读
- c# - EF Core,禁用外键列名生成
- c++ - Visual Studio C++ 对 UINT16 和 UINT32 有不同的比较结果
- python - TF 训练模型的冻结图 - AssertionError:dense_7/BiasAdd_1 不在图中
- javascript - 如何在 TypeScript 中进行投影?
- firebase - 具有多个 Firebase 项目的单一反应本机应用程序(相同的 SHA 证书指纹)
- python - Django 无法迁移到新数据库
- javascript - if 语句满足多个条件但在第一个匹配的条件处停止
- python - 如何修复 PyQt6-tools 安装错误?
- javascript - 如何更新由 EntityAdapter redux 组成的嵌套对象?
- docker - AdGuard Home 使用 Portainer 在云中托管