【问题标题】:Group by with 2 distinct columns in SQL Server在 SQL Server 中使用 2 个不同的列分组
【发布时间】:2011-07-06 09:54:09
【问题描述】:

我有如下数据

ID  Stat    Date
1   1       2009-06-01
2   1       2009-06-20
3   1       2009-06-10
4   2       2009-06-10

O/P 是这样的..

ID     Stat   CDate
2      1      2009-06-20
4      2      2009-06-10

我尝试了以下查询,但不成功,请提出建议。

Select Distinct stat,MAX(Cdate) dt,id  From testtable
Group By stat,id

找到解决办法了..

选择 f1.id,f1.stat,f1.cdate From testtableas F1 Join(Select stat,MAX(cdate) as dt from testtable group by stat) as F2 关于 f2.stat=F1.stat 和 f2.dt=f1.cdate

【问题讨论】:

    标签: sql sql-server sql-server-2005 sql-server-2008


    【解决方案1】:
    SELECT t1.id, t1.stat, t1.date
    FROM testtable t1
    JOIN (SELECT stat, MAX(date) date FROM testtable GROUP BY stat) t2 ON t1.stat = t2.stat AND t1.date = t2.date
    GROUP BY stat
    

    【讨论】:

    • 几乎,您在外部选择中的列名不明确,因此您需要为表和子查询设置别名并消除列的歧义。
    【解决方案2】:

    我假设你想要属于最大日期的统计数据,对吧?

    select t1.id, t1.stat, t1.cdate 
    from testtable t1,
      (select stat, max(cdate) max_date from testtable
       group by stat) t2
    where t1.stat = t2.stat and t1.cdate = t2.max_date
    

    【讨论】:

      【解决方案3】:

      您不能在此处添加 id。因为对 id 进行分组将不会是预期的结果。默认情况下,id 本质上是不同的。所以对 id 进行分组会得到所有的数据。

      【讨论】:

      • 是的@Ray,我错过了那个。谢谢。
      【解决方案4】:
      ;与 CTE AS ( 选择 stat,MAX(Cdate)Over(Partition by stat) 作为 dt,id 从测试表 ) 选择 ID,stat,dt 来自 CTE 内部 JOIn testtable 在 testtable.id=CTE.ID 和 testtable.date=CTE.dt 按统计分组

      【讨论】:

        【解决方案5】:

        不过,我喜欢 nicktrs 的解决方案。如果您使用的是 SQL SERVER 2005 或更高版本,这可能对您有用;

        select k.id, k.stat, k.cdate from(
            select id, stat, cdate, row_num=rownumber()
            over (partition by stat order by cdate desc) as k from testtab )
        where k.row_num=1;
        

        内部查询的输出如下:

        ID  Stat    Date         Row_num
        2   1       2009-06-20   1
        3   1       2009-06-10   2
        1   1       2009-06-01   3
        4   2       2009-06-10   1
        

        执行完整查询后的输出:

        ID  Stat    Date
        2   1       2009-06-20
        4   2       2009-06-10
        

        希望这会有所帮助。再见。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多