我有以下问题 - 我有一个包含4列的表:Id,Name,InsertTime,UpdateTime。 我想计算每个名字(不是唯一的!)有多少同名的不同 InsertTime或UpdateTime。 例如,如果我有以下数据:
ID NAME INSERTED_TIME UPDATE_TIME
1 maya 21-12-2015 21-12-2015
2 tal 22-12-2015 21-12-2015
3 maya 21-09-2015 21-12-2015
4 mark 21-12-2015 21-12-2015
5 mark 21-12-2015 21-12-2015
我希望结果是:
NAME COUNT
maya 1
tal 0
mark 0
解释:" maya"有1个不同的InsertTime或UpdateTime重复。 " TAL"没有重复。并且"标记"有一个重复,但InsertTime和UpdateTime都是相同的,所以它不算数。
我试过了:
SELECT COUNT(*)
FROM table t1
JOIN table t2 on t1.NAME=t2.NAME
where (t1.INSERTED_TIME<>t2.INSERTED_TIME or t1.UPDATE_TIME<>t2.UPDATE_TIME)
但这会返回重复项。 我也尝试过使用GROUP BY的不同方法 - 到目前为止还没有任何工作。
任何帮助都将不胜感激。
答案 0 :(得分:2)
您可以使用窗口函数:
WITH cte AS
(
SELECT NAME,
RN = RANK() OVER (PARTITION BY NAME ORDER BY INSERTED_TIME,UPDATE_TIME) - 1
FROM #table t1
)
SELECT NAME, [COUNT] = MAX(RN)
FROM cte
GROUP BY NAME
ORDER BY [COUNT] DESC
的 LiveDemo
强>
答案 1 :(得分:2)
使用GROUP BY并计算每个名称的行数:
;WITH CTE as
(
SELECT NAME
FROM yourtable
GROUP BY NAME, INSERTED_TIME, UPDATE_TIME
)
SELECT NAME, count(*) - 1 COUNT
FROM CTE
GROUP BY NAME
结果:
NAME COUNT
mark 0
maya 1
tal 0
答案 2 :(得分:0)
您可以使用COUNT(DISTINCT
为每个名称获取INSERTED_TIME
和UPDATE_TIME
的不同值的数量,然后只需从此数字中扣除1即可获得所需的输出。
DECLARE @T TABLE (ID INT, Name VARCHAR(50), INSERTED_TIME DATE, UPDATE_TIME DATE);
INSERT @T
VALUES
(1, 'maya', '2015-12-21', '2015-12-21'),
(2, 'tal', '2015-12-22', '2015-12-21'),
(3, 'maya', '2015-09-21', '2015-12-21'),
(4, 'mark', '2015-12-21', '2015-12-21'),
(5, 'mark', '2015-12-21', '2015-12-21');
SELECT name,
[COUNT] = COUNT(DISTINCT CONCAT(INSERTED_TIME, UPDATE_TIME)) - 1
FROM @T
GROUP BY Name
ORDER BY [COUNT] DESC;