0

我正在尝试使用 group by 编写一个 sql 查询,以便我可以从一列的相同原始条件中获取列,我不能使用聚合函数

例如员工表

EmpId   data1 data2 data3 reg_date
--------------------------------------
1       1     2     2     2013/06/12
1       5     6     7     2013/06/13

我想要按 EmpId 分组并想要 reg_date 为最大值的所有其他数据。

SELECT EmpId,data1,data2,data3,reg_date FROM Employee
GROUP BY EmpId

显然这会产生错误,因为它需要 data1、data2、data3 和 reg_date 的聚合函数来决定从两个值中选择哪个值。

但是我可以对 reg_date 使用 MAX 函数吗,并且可以为该最大日期选择所有数据字段

4

3 回答 3

0

下面的查询应该大致可以满足您的需求。因此,在第一个选择中,它会结合最新的 reg_date 获取 empID。第二个选择获取表中的所有数据,在最终选择中,我们按照列出的标准加入 2 个数据集,这应该为您提供 empID、最大注册日期以及对应的 data1、data2、data3 的值。

;with
  GetDataSet1 as
  (
  SELECT EmpId,MAX(reg_date) "MaxRegDate" 
  FROM Employee 
  GROUP BY EmpId
  )
  ,GetDataSet2 as
  (
   SELECT EmpId,data1,data2,data3,reg_date
   FROM Employee 
  )
  select *
  FROM GetDataSet1 a
  JOIN GetDataSet2 b on a.EmpID = b.EmpID AND a.MaxRegDate = b.reg_date
于 2013-06-13T03:20:48.290 回答
0
SELECT t1.EmpId,t1.Data1,t1.Data2,t1.Data3, MAX(Reg_date) AS MAXDATES FROM
(SELECT EmpId,Data1,Data2,Data3, MAX(Reg_date) AS MAXDATE
FROM Employee
GROUP BY EmpId,Data1,Data2,Data3 ) as t1
LEFT JOIN
(SELECT EmpId, MAX(Reg_date) AS MAXDATE
SELECT EmpId,Data1,Data2,Data3
FROM Employee) as t2
ON t1.EmpId=t2.EmpId
GROUP BY t1.EmpId,t1.Data1,t1.Data2,t1.Data3 

试试这个,看看。

于 2013-06-13T03:20:50.867 回答
0

尝试使用Row_Numberand Partiton..this 假设在这种情况下最好...你可以尝试这样...

Select EmpId,data1,data2,data3,reg_date from 
( 
SELECT Row_Number()  Over(Partition By EmpId Order by reg_date desc) as Row, EmpId,data1,data2,data3,reg_date FROM Employee
) t where t.Row=1;
于 2013-06-13T03:27:11.827 回答