【问题标题】:sql query to select columns by condition on specific column(with out aggregate function) with group bysql查询按条件在特定列上选择列(没有聚合函数),分组依据
【发布时间】:2013-06-13 03:06:05
【问题描述】:

我正在尝试使用 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 函数,并且可以为该最大日期选择所有数据字段

【问题讨论】:

  • 你可以尝试使用 MAX。如果您发布您的代码会很好,以便我们能够更好地帮助您。

标签: sql


【解决方案1】:

尝试使用Row_NumberPartiton ..这假设在这种情况下最好...您可以尝试这样...

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;

【讨论】:

    【解决方案2】:

    下面的查询应该大致满足您的需求。因此,在第一个选择中,它会结合最新的 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
    

    【讨论】:

      【解决方案3】:
      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 
      

      试试这个看看。

      【讨论】:

      • 您不能像这样执行 max(reg_date),因为它只会在每条记录的 data1、data2 和 data3 的值相同时对它们进行分组,否则会生成重复条目。跨度>
      猜你喜欢
      • 1970-01-01
      • 2016-10-02
      • 2021-12-02
      • 2012-12-09
      • 1970-01-01
      • 1970-01-01
      • 2010-09-08
      • 1970-01-01
      • 2018-03-22
      相关资源
      最近更新 更多