Sql - 如何计算按另一列

时间:2015-12-10 13:03:24

标签: sql sql-server group-by

我有以下问题 - 我有一个包含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的不同方法 - 到目前为止还没有任何工作。

任何帮助都将不胜感激。

3 个答案:

答案 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_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;