48

我确实四处搜索,发现此 SQL 选择最近日期的行,其中包含两个唯一列 ,这与我想要的非常接近,但我似乎无法使其工作。

我收到错误 选择列表中的“ID”列无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。

我想要每个不同名称的最新行

Select ID,Name,Price,Date
From  table
Group By Name
Order By Date ASC

这是我想要的一个例子

桌子

ID 姓名 价格 日期
0 一个 10 2012-05-03
1 9 2012-05-02
2 一个 8 2012-05-04
3 C 10 2012-05-03
4 8 2012-05-01

期望的结果

ID 姓名 价格 日期
2 一个 8 2012-05-04
3 C 10 2012-05-03
1 9 2012-05-02

我正在使用 Microsoft SQL Server 2008

4

4 回答 4

66
Select ID,Name, Price,Date
From  temp t1
where date = (select max(date) from temp where t1.name =temp.name)
order by date desc

这是一个带有上述演示的SQL Fiddle


或者正如康拉德指出的那样,您可以使用 INNER JOIN(另一个带有演示的SQL Fiddle ):

SELECT t1.ID, t1.Name, t1.Price, t1.Date 
FROM   temp t1 
INNER JOIN 
(
    SELECT Max(date) date, name
    FROM   temp 
    GROUP BY name 
) AS t2 
    ON t1.name = t2.name
    AND t1.date = t2.date 
ORDER BY date DESC 
于 2012-05-04T16:59:07.923 回答
20

有几种方法可以做到这一点。这个使用 ROW_NUMBER。只需按名称分区,然后按您想要将所需值放在第一位的内容进行排序。

WITH cte 
     AS (SELECT Row_number() OVER (partition BY NAME ORDER BY date DESC) RN, 
                id, 
                name, 
                price, 
                date 
         FROM   table1) 
SELECT id, 
       name, 
       price, 
       date 
FROM   cte 
WHERE  rn = 1 

演示

请注意,您可能应该(partition BY NAME ORDER BY date DESC, ID DESC) 在实际查询中添加 ID 作为日期的决胜局

于 2012-05-04T16:56:52.183 回答
8
select * from (
    Select
        ID, Name, Price, Date,
        Rank() over (partition by Name order by Date) RankOrder
    From table
) T
where RankOrder = 1
于 2012-05-04T17:01:06.237 回答
-8

使用Distinct而不是Group By

Select Distinct ID,Name,Price,Date
From  table
Order By Date ASC

http://technet.microsoft.com/en-us/library/ms187831.aspx

于 2012-05-04T16:58:54.397 回答