-1

今天早上我遇到了一个问题,我尝试了很多解决方案,但都没有给我预期的结果。

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

+----+----------+-------+
| 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 | 
+----+----------+-------+

但我不知道我该怎么做。我试过加入,交叉申请..

如果你有什么想法,

谢谢

克莱门特法亚德

4

5 回答 5

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
于 2014-11-20T09:44:25.650 回答
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(对于“max”)的表与自身(别名o,对于“others”)连接起来ID;该条件m.DATE < o.DATE会将 中的所有行mo中具有更大值的行组合起来DATEDATE对于给定的IDfrom值,具有最大值 的行m没有对 in o(没有大于最大值的值)。因为LEFT JOIN这一行会和NULLs的一行合并。该WHERE子句仅选择具有NULLfor 的这些行o.DATE(即它们具有 的最大值m.DATE)。

查看SQL Antipatterns: Avoiding the Pitfalls of Database Programming一书了解其他 SQL 技巧。

于 2014-11-20T10:12:47.860 回答
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。我不了解表格背后的业务逻辑,但对我来说似乎有一些缺陷。

于 2014-11-20T10:44:39.153 回答
0
SELECT ID,MAX(Col2),MAX(Date) FROM tableName GROUP BY ID
于 2014-11-20T09:54:54.560 回答
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
于 2014-11-20T09:59:53.470 回答