Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何编写包含GROUPBY子句中未包含的列的标准SQL GROUPBY_Sql_Sql Server - Fatal编程技术网

如何编写包含GROUPBY子句中未包含的列的标准SQL GROUPBY

如何编写包含GROUPBY子句中未包含的列的标准SQL GROUPBY,sql,sql-server,Sql,Sql Server,假设我有一个名为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.Depart

假设我有一个名为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
但是如果我想返回被雇佣者的姓名,我该怎么办?即,我希望此结果集:

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
我不记得看到过实现这一点的查询


注意:不接受加入“已雇用”字段,因为这不能保证准确。

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

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
标准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)

不相关的问题:可能也不适合加入名称字段。名称不唯一。嵌套选择是您的朋友。此查询返回正确的行数,但可能不会返回正确的值。一些数据库(特别是MySQL)将在ORDERBY子句之前应用GROUPBY。恐怕这不是标准。如果是的话,我就不会问这个问题了。
select * 
from Customer 
where  (DepartmentId, Hired) in 

(select DepartmentId, MAX(Hired)
 from Customer 
 group by DepartmentId)
SELECT a.*
FROM Customer AS a
JOIN
(SELECT DepartmentId, MAX(Hired) AS Hired
FROM Customer GROUP BY DepartmentId) AS b
USING (DepartmentId,Hired);