【问题标题】:How do I write a standard SQL GROUP BY that includes columns not in the GROUP BY clause如何编写包含不在 GROUP BY 子句中的列的标准 SQL GROUP BY
【发布时间】:2011-03-06 04:01:28
【问题描述】:

假设我有一个名为 Customer 的表,定义如下:

Id       Name       DepartmentId    Hired
1        X          101             2001/01/01
2        Y          102             2002/01/01
3        Z          102             2003/01/01

我想检索每个部门最后一次招聘的日期。

显然我会这样做

SELECT c.DepartmentId, MAX(c.Hired)
  FROM Customer c
 GROUP BY c.DepartmentId

返回:

101      2001/01/01
102      2003/01/01

但是,如果我想返回所雇用人员的姓名,我该怎么办? IE。我想要这个结果集:

101      2001/01/01       X
102      2003/01/01       Z

请注意,以下内容不起作用,因为它将返回三行而不是我要查找的两行:

SELECT c.DepartmentId, c.Name, MAX(c.Hired)
  FROM Customer c
 GROUP BY c.DepartmentId

我不记得看到过实现此目的的查询。

注意:加入 Hired 字段是不可接受的,因为不能保证准确。

【问题讨论】:

标签: sql sql-server


【解决方案1】:

子选择将完成这项工作,并处理同一部门在同一天雇用了多个人的情况:

SELECT c.DepartmentId, c.Name, c.Hired from Customer c,
(SELECT DepartmentId, MAX(Hired) as MaxHired
  FROM Customer
 GROUP BY DepartmentId) as sub
WHERE c.DepartmentId = sub.DepartmentId AND c.Hired = sub.MaxHired

【讨论】:

    【解决方案2】:

    标准 Sql:

    select * 
    from Customer C
    
    where exists
    (
      -- Linq to Sql put NULL instead ;-) 
      -- In fact, you can even put 1/0 here and would not cause division by zero error
      -- An RDBMS do not parse the select clause of correlated subquery
      SELECT NULL 
    
      FROM Customer 
    
      where c.DepartmentId = DepartmentId
    
      GROUP BY DepartmentId
    
      having c.Hired = MAX(Hired)
    ) 
    

    如果 Sql Server 恰好支持元组测试,这是最简洁的:

    select * 
    from Customer 
    where  (DepartmentId, Hired) in 
    
    (select DepartmentId, MAX(Hired)
     from Customer 
     group by DepartmentId)
    

    【讨论】:

      【解决方案3】:
      SELECT a.*
      FROM Customer AS a
      JOIN
      (SELECT DepartmentId, MAX(Hired) AS Hired
      FROM Customer GROUP BY DepartmentId) AS b
      USING (DepartmentId,Hired);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-05-17
        • 2022-09-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-06
        • 1970-01-01
        相关资源
        最近更新 更多