【问题标题】:Return all rows/columns where multiple columns are non distinct返回多列不不同的所有行/列
【发布时间】:2013-11-21 19:52:26
【问题描述】:

我有一个查询,我想查找 ActivityDate 和 TaskId 同时有多个条目的行:

SELECT
    ActivityDate, taskId
FROM
    [DailyTaskHours]
GROUP BY
    ActivityDate, taskId
HAVING 
    COUNT(*) > 1

上述查询似乎有效。但是,我希望所有列现在只返回两个(ActivityDate、taskId)。这不起作用:

SELECT *
FROM
    [DailyTaskHours]
GROUP BY
    ActivityDate, taskId
HAVING 
    COUNT(*) > 1

因为许多列不在 group by 子句中。除了 ActivityDate、taskId 之外,我不希望任何列受到 HAVING COUNT(*) > 1 的影响。

我如何做到这一点?

【问题讨论】:

  • 我提供了一个答案。这恰好与您在大约 20m 前删除的问题的答案完全相同。

标签: sql sql-server


【解决方案1】:
WITH sel as(
SELECT
    ActivityDate, taskId
FROM
    [DailyTaskHours]
GROUP BY
    ActivityDate, taskId
HAVING 
    COUNT(*) > 1
)
SELECT * 
      FROM [DailyTaskHours] d
           INNER JOIN sel ON d.ActivityDate = sel.ActivityDate AND d.taskId = sel.taskId

【讨论】:

  • @Linger 我不明白请求不同结果的原始查询。假设DailyTaskHours 有一个主键,这是最佳实践,那么DISTINCT 将无效。但是,当然,如果需要,可以轻松添加 DISTINCT
【解决方案2】:
SELECT t1.*
FROM
    [DailyTaskHours] t1
INNER JOIN (
  SELECT
      ActivityDate, taskId
  FROM
      [DailyTaskHours]
  GROUP BY
      ActivityDate, taskId
  HAVING 
      COUNT(*) > 1
) t2 ON (
  t1.ActivityDate = t2.ActivityDate AND
  t1.taskId = t2.taskId
)

【讨论】:

    【解决方案3】:
    -- fully functional example.
    DECLARE @table TABLE ( ActivityDate DATE, TaskID INT);
    
    SET NOCOUNT ON;
    INSERT @table VALUES ('01/01/2013',1);
    INSERT @table VALUES ('01/02/2013',1);
    INSERT @table VALUES ('01/02/2013',2);
    INSERT @table VALUES ('01/03/2013',1);
    INSERT @table VALUES ('01/03/2013',2);
    INSERT @table VALUES ('01/03/2013',5); -- duplicate date,taskid
    INSERT @table VALUES ('01/03/2013',5); -- duplicate date,taskid
    SET NOCOUNT OFF;
    
    SELECT A.*
    FROM @table A
        INNER JOIN (
            SELECT [ActivityDate], TaskId
            FROM @table
            GROUP BY [ActivityDate], TaskId
            HAVING Count(*) > 1
        ) AS B ON B.[ActivityDate]=A.ActivityDate AND B.TaskId=A.TaskId;
    

    【讨论】:

      【解决方案4】:

      这是SQL Fiddle,它显示了以下查询:

      SELECT DISTINCT m.* 
      FROM 
      (
        SELECT s.ActivityDate, s.taskId
        FROM DailyTaskHours s
        GROUP BY s.ActivityDate, s.taskId
        HAVING COUNT(*) > 1
      ) sub
      JOIN DailyTaskHours m 
      ON m.taskId = sub.taskId
      AND m.ActivityDate = sub.ActivityDate
      

      【讨论】:

      • 您在联接子句中缺少 ActivityDate
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-17
      相关资源
      最近更新 更多