我有一个问题,我已经尝试了很多解决方案,没有给我预期的结果。
我有一个看起来像这样的表:
+----+----------+-------+
| 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
答案 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
中的所有行与o
中DATE
中具有更大值的行组合在一起。对于来自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。我不明白桌子背后的商业逻辑,但它似乎对我有一些缺陷。