【问题标题】:Get the latest records per Group By SQL获取每个 Group By SQL 的最新记录
【发布时间】:2016-05-15 03:23:59
【问题描述】:

我有下表:

-----------------------------------------------------------
ID     oDate         oName     oItem    oQty    oRemarks
-----------------------------------------------------------
1      2016-01-01    A         001      2       
2      2016-01-01    A         002      1       test
3      2016-01-01    B         001      3  
4      2016-01-02    B         001      2
5      2016-01-02    C         001      2
6      2016-01-03    B         002      1
7      2016-01-03    B         001      4
       ff.

我想获取每个名称的最新记录。所以结果应该是这样的:

-----------------------------------------------------------
oDate         oName     oItem    oQty    oRemarks
-----------------------------------------------------------
2016-01-01    A         001      2       
2016-01-01    A         002      1       test
2016-01-02    C         001      2
2016-01-03    B         002      1
2016-01-03    B         001      4
ff.

有谁知道如何得到这个结果?

【问题讨论】:

标签: sql sql-server select sql-server-2008-r2 groupwise-maximum


【解决方案1】:

rank 窗口子句允许您根据某些分区对行进行排序,然后您可以只选择顶部的行:

SELECT oDate, oName, oItem, oQty, oRemarks
FROM   (SELECT oDate, oName, oItem, oQty, oRemarks,
               RANK() OVER (PARTITION BY oName ORDER BY oDate DESC) AS rk
        FROM   my_table) t
WHERE  rk = 1

【讨论】:

    【解决方案2】:

    这是一个不使用解析函数的通用查询。

    SQLFiddle Demo

    SELECT a.*
    FROM table1 a
    INNER JOIN
        (SELECT max(odate) modate,
              oname,
              oItem
       FROM table1
       GROUP BY oName,
                oItem
        ) 
        b ON a.oname=b.oname
    AND a.oitem=b.oitem
    AND a.odate=b.modate
    

    【讨论】:

      【解决方案3】:

      在表中添加一个primary key 假设id 字段并使其自动递增。然后通过id 订购,您将得到它。这是传统的方式。通过使用您的餐桌,您只能通过oDate 订购。但是有多次相同的日期,所以它也不会解决你的问题。

      【讨论】:

        【解决方案4】:

        我认为您需要这样的查询:

        SELECT *
        FROM (SELECT *,
                ROW_NUMBER() OVER (PARTITION BY oName ORDER BY oDate DESC) seq
            FROM yourTable) t
        WHERE (seq <= 2)
        ORDER BY oDate; 
        

        【讨论】:

          【解决方案5】:

          你必须在下面使用ROW_NUMBER

          select oDate, oName, oItem, oQty, oRemarks
          from (
             select *, row_number() over(partition by oName, oItem order by oDate desc) rn  
             from #t
          )x
          where rn = 1
          order by oDate
          

          输出

          oDate   oName   oItem   oQty    oRemarks    
          2016-01-01  A   001     2                   
          2016-01-01  A   002     1       test        
          2016-01-02  C   001     2                   
          2016-01-03  B   001     4                   
          2016-01-03  B   002     1                   
          

          【讨论】:

            猜你喜欢
            • 2013-06-27
            • 2012-06-15
            • 2023-03-15
            • 1970-01-01
            • 2020-12-19
            • 2018-07-03
            • 2020-08-11
            相关资源
            最近更新 更多