SQL选择第一列,每行选择唯一ID和最后一个日期

时间:2014-11-20 09:40:22

标签: sql sql-server join unique cross-apply

我有一个问题,我已经尝试了很多解决方案,没有给我预期的结果。

我有一个看起来像这样的表:

+----+----------+-------+
| ID | COL2     | DATE  | 
+----+----------+-------+
|  1 | 1        |  2001 | 
|  1 | 2        |  2002 | 
|  1 | 3        |  2003 | 
|  1 | 4        |  2004 | 
|  2 | 1        |  2001 | 
|  2 | 2        |  2002 | 
|  2 | 3        |  2003 | 
|  2 | 4        |  2004 | 
+----+----------+-------+

我有一个返回如下结果的查询: 我有唯一的ID,对于此ID,我想要获取ID的最后日期

+----+----------+-------+
| ID | COL2     | DATE  | 
+----+----------+-------+
|  1 | 4        |  2004 | 
|  2 | 4        |  2004 | 
+----+----------+-------+

但我不知道如何做到这一点。 我试过加入,交叉申请..

如果你有一些想法,

谢谢

Clement FAYARD

5 个答案:

答案 0 :(得分:1)

declare @t table (ID INT,Col2 INT,Date INT)
insert into @t(ID,Col2,Date)values (1,1,2001)
insert into @t(ID,Col2,Date)values (1,2,2001)
insert into @t(ID,Col2,Date)values (1,3,2001)
insert into @t(ID,Col2,Date)values (1,4,2001)
insert into @t(ID,Col2,Date)values (2,1,2002)
insert into @t(ID,Col2,Date)values (2,2,2002)
insert into @t(ID,Col2,Date)values (2,3,2002)
insert into @t(ID,Col2,Date)values (2,4,2002)

;with cte as(
    select
        *,
        rn = row_number() over(partition by ID order by Col2 desc)
    from @t

)
select
    ID,
    Col2,
    Date
from cte
where
    rn = 1

答案 1 :(得分:0)

SELECT ID,MAX(Col2),MAX(Date) FROM tableName GROUP BY ID

答案 2 :(得分:0)

如果col2和date总是组合中的最高值而不是你可以尝试

SELECT ID, MAX(COL2), MAX(DATE)
FROM Table1
GROUP BY ID

但这并不好。 替代方案是子查询:

SELECT yourtable.ID, sub1.COL2, sub1.DATE
FROM yourtable 
INNER JOIN -- try with CROSS APPLY for performance AND without ON 1=1
(SELECT TOP 1 COL2, DATE
 FROM yourtable sub2
 WHERE sub2.ID = topquery.ID
 ORDER BY COL2, DATE) sub1 ON 1=1

答案 3 :(得分:0)

您没有告诉您桌子的名称是什么,所以我假设它下面是tbl

SELECT m.ID, m.COL2, m.DATE
FROM tbl m
  LEFT JOIN tbl o ON m.ID = o.ID AND m.DATE < o.DATE
WHERE o.DATE is NULL
ORDER BY m.ID ASC

<强>解释: 查询左侧使用列tbl将表m别名为o(对于“max”)与其自身(别名ID,对于“其他”)加入;条件m.DATE < o.DATE会将m中的所有行与oDATE中具有更大值的行组合在一起。对于来自DATE的给定值ID,具有最大值m的行在o中没有对(没有大于最大值的值)。由于LEFT JOIN,此行将与一行NULL组合。 WHERE子句仅选择NULL o.DATE的{​​{1}}行(即最大值为m.DATE)。

查看SQL Antipatterns: Avoiding the Pitfalls of Database Programming本书以获取其他SQL提示。

答案 4 :(得分:0)

为了做到这一点,你必须排除COL2你的查询应该是这样的

SELECT ID, MAX(DATE) 
FROM table_name 
GROUP BY ID 

以上查询为每个ID生成最大日期。 使用该查询的COL2没有意义,除非您想要每个ID和COL2的最大日期 在这种情况下,您可以运行:

SELECT ID,COL2,MAX(DATE) GROUP BY ID,COL2;

使用聚合函数(如max())时,必须始终按select语句中的所有其他列进行分组。

我认为你正面临着这个问题,因为你对桌子的设计有一些基本的缺陷。通常ID应该是主键(唯一)。在此表中,您有重复的ID。我不明白桌子背后的商业逻辑,但它似乎对我有一些缺陷。