我有下表:
+--------+------+---------+------------+
| ID | TEAM | WEEK_NO | Money_paid |
+--------+------+---------+------------+
| 112233 | AA | 201801 | 100 |
| 112233 | BB | 201801 | 0 |
| 112233 | BB | 201802 | 0 |
| 112233 | BB | 201803 | 0 |
| 454545 | AA | 201801 | 100 |
| 658855 | BB | 201802 | 100 |
| 658855 | BB | 201802 | 100 |
| 112233 | BB | 201809 | 0 |
+--------+------+---------+------------+
,我希望使用该规则的结果如下表所示 计算Money_paid相同的连续week_no.s。它是连续的顺序:
+--------+------+---------+------------+-------+
| ID | TEAM | WEEK_NO | Money_paid | Count |
+--------+------+---------+------------+-------+
| 112233 | AA | 201801 | 100 | 1 |
| 112233 | BB | 201801 | 0 | 3 |
| 112233 | BB | 201802 | 0 | 3 |
| 112233 | BB | 201803 | 0 | 3 |
| 454545 | AA | 201801 | 100 | 1 |
| 658855 | BB | 201802 | 100 | 1 |
| 112233 | BB | 201809 | 0 | 1 |
+--------+------+---------+------------+-------+
到目前为止,我已经尝试了很多方法,但是没有一个方法能达到预期的结果。
select top 10
Concat(TEAM, ID) AS Concatbu_ac, count(*)
from
(select
*,
(row_number() over (order by week_no) -
row_number() over (partition by Concat(team, ID) order by week_no)
) as group5
from
table5) t
group by
group5, Concat(team, ID);
答案 0 :(得分:0)
如果我的理解正确,您想根据ID和团队支付的金额来计算周数。这个想法是通过ID, Team, Money_Paid
来计数记录组,然后通过唯一列进行自我连接。希望这能回答您的问题。
DECLARE @dataset TABLE (
ID INT,
Team VARCHAR(10),
Week_No INT,
Money_Paid INT
)
INSERT INTO @dataset SELECT 112233, 'AA', 201801, 100
INSERT INTO @dataset SELECT 112233, 'BB', 201801, 0
INSERT INTO @dataset SELECT 112233, 'BB', 201802, 0
INSERT INTO @dataset SELECT 112233, 'BB', 201803, 0
INSERT INTO @dataset SELECT 454545, 'AA', 201801, 100
INSERT INTO @dataset SELECT 658855, 'BB', 201802, 100 --duplicate
INSERT INTO @dataset SELECT 658855, 'BB', 201802, 100 --duplicate
INSERT INTO @dataset SELECT 112233, 'BB', 201809, 0
--week count
SELECT
ds.*,
x.WeekCount
FROM @dataset ds
JOIN (
SELECT
ID,
Team,
COUNT(Week_No) AS WeekCount
FROM @dataset
GROUP BY ID, Team, Money_Paid
) x
ON ds.ID = x.ID
AND ds.Team = x.Team
ORDER BY ID, Team, Week_No
--week to date
SELECT
ds.*,
COUNT(*) OVER (PARTITION BY ID, Team, Money_Paid ORDER BY ID, Team, Week_No) AS WeekToDate
FROM @dataset ds