考虑这个表"板球;
第一队 | 第二队 | 获胜者>日期 | 新西兰获胜 |
---|---|---|---|
新西兰 | 巴基斯坦 | 新西兰2018-01-06 | |
新西兰 | 英格兰 | 新西兰2018-01-09 | |
新西兰 | 印度 | 印度2018-01-13 | |
新西兰 | 孟加拉国 | 新西兰2018-01-16 |
首先,我推荐ROW_NUMBER()
而不是COUNT(*)
。尽管它们有细微的不同(当ORDER BY
中有重复时会产生不同的结果(,但ROW_NUMBER()
更口语化地表示您想要做的事情
其次,您只需要一个CASE
表达式:
SELECT c.[Team 1], c.[Team 2], c.[Winner], c.[Date],
(CASE WHEN c.Winner = 'New Zealand'
THEN ROW_NUMBER() OVER (Partition by c.Winner order by c.[Date])
END) AS NewZealandWon
FROM Cricket c
ORDER BY c.[Date];
我认为GROUP BY
没有必要,所以我把它去掉了
测试
SELECT c.[Team 1],
c.[Team 2],
c.[Winner],
c.[Date],
COUNT(CASE WHEN c.[Team 1] = c.[Winner] THEN 1 END) OVER (PARTITION BY c.[Winner]) AS NewZealandWon
FROM Cricket c
Group by c.[Date],c.[Team 1],c.[Team 2],c.[Winner]
Order by c.[Date]
我会使用联接来实现这一点。
SELECT c.[Team 1],c.[Team 2],c.[Winner], c.[Date], w.[NewZealandWon]
FROM Cricket c
LEFT JOIN (SELECT [Date], COUNT(*) AS NewZealandWon FROM Cricket WHERE [Winner]='New Zealand' GROUP BY [Date]) w ON w.[Date]=c.[Date]
顺便说一句,你的问题带有";mysql";但是查询看起来像是";mssql";也许你应该纠正这一点;(