【问题标题】:Sql - How to count different column values grouped by another columnSql - 如何计算由另一列分组的不同列值
【发布时间】:2015-12-10 13:03:24
【问题描述】:

我有以下问题 - 我有一个包含 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”没有重复项。并且“mark”有一个重复,但是 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 的不同方法 - 到目前为止没有任何效果。

任何帮助将不胜感激。

【问题讨论】:

    标签: sql sql-server 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

      【讨论】:

        【解决方案3】:

        您可以使用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;
        

        【讨论】:

          猜你喜欢
          • 2018-11-29
          • 2016-11-07
          • 2018-03-07
          • 1970-01-01
          • 1970-01-01
          • 2020-02-05
          • 1970-01-01
          • 2015-04-22
          • 2022-11-22
          相关资源
          最近更新 更多