通过SQL获取每个组的最新记录

通过SQL获取每个组的最新记录,sql,sql-server,sql-server-2008-r2,groupwise-maximum,Sql,Sql Server,Sql Server 2008 R2,Groupwise Maximum,我有下表: 我想得到每个名字的最新记录。所以结果应该是这样的: SELECT * FROM (SELECT *, ROW_NUMBER() OVER (PARTITION BY oName ORDER BY oDate DESC) seq FROM yourTable) t WHERE (seq <= 2) ORDER BY oDate; 有人知道如何得到这个结果吗? 谢谢。我想您需要这样的查询: SELECT * FROM (SELECT *,

我有下表:

我想得到每个名字的最新记录。所以结果应该是这样的:

SELECT *
FROM (SELECT *,
        ROW_NUMBER() OVER (PARTITION BY oName ORDER BY oDate DESC) seq
    FROM yourTable) t
WHERE (seq <= 2)
ORDER BY oDate; 
有人知道如何得到这个结果吗?
谢谢。

我想您需要这样的查询:

SELECT *
FROM (SELECT *,
        ROW_NUMBER() OVER (PARTITION BY oName ORDER BY oDate DESC) seq
    FROM yourTable) t
WHERE (seq <= 2)
ORDER BY oDate; 
您必须在以下情况下使用行号:

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
输出

window子句允许您根据某些分区对行进行排序,然后只需选择最上面的行:

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

向表中添加主键假定id字段并使其自动递增,。然后按id订购,您将获得它。这是传统的方式。通过使用表格,您只能按oDate订购。但是,同一个日期是多次的,所以这也不能解决你的问题

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


结果不是每个名称的最新记录,因为存在重复的名称。@Haminteu添加主键buddy它将解决您的问题,您可以按此进行订购。@androidGenX,您好。只需编辑表格。我的表上有标识栏。干杯。@Haminteu检查答案。可能是重复的
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                   
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
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