2015-12-10 108 views
2

我有以下问题 - 我有一个4列的表:Id,Name,InsertTime,UpdateTime。 我想为每个名称计数(不是唯一的!)有多少个具有相同名称的不同 InsertTime或UpdateTime。 例如,如果我有以下数据:Sql的 - 如何计算不同的列值按另一列分组

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 

Explantion: “玛雅” 有1次重复的不同InsertTime或录入。 “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的不同方法 - 到目前为止没有任何工作。

任何帮助,将不胜感激。

回答

1

使用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

您可以使用窗口功能:

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

0

您可以使用COUNT(DISTINCT得到不同值的数量INSERTED_TIMEUPDATE_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; 
相关问题