关于sql:获取其他列值更改的最新日期值

Getting most recent date values where other column values change

本问题已经有最佳答案,请猛点这里访问。

我有一张表如下:

1
2
3
4
5
6
7
8
9
  id VALUE  DATE
  ---------------
  a, test,  01-01-15
  a, test,  01-02-15
  a, test,  01-03-15
  a, test1, 01-04-15
  a, test1, 01-05-15
  b, test, 01-01-15
  b, test, 01-02-15

我需要编写一个查询,以便能够获取a&的最新映射。b

例如,我希望我的结果如下:

1
2
a, test1, 01-05-15
b, test,  01-02-15

我似乎无法理解如何实现这一目标

1
SELECT MAX(DATE)

仅返回最新的日期值

并且select max(date), value group by value显然不会返回id列


简单

1
2
3
SELECT DISTINCT ON (id) *
FROM   tbl
ORDER  BY id, DATE DESC NULLS LAST;

详细说明:

  • 选择每个GROUP BY组中的第一行?

快速

对于每id多行的数据分布:

  • 优化GROUP BY查询以检索每个用户的最新记录

根据您使用的SQL版本,您可能有一个名为ROW_NUMBER() OVER()的函数可以提供帮助。

1
2
3
4
5
6
7
8
WITH x AS
(SELECT id, VALUE, DATE
        , ROW_NUMBER() OVER (PARTITION BY id ORDER BY DATE DESC) AS RowNum
FROM TABLE
)
SELECT id, VALUE, DATE
FROM x
WHERE RowNum = 1

以上内容适用于SQL Server以及支持CTE和窗口函数的任何其他内容。 你也可以把它写成派生表,如下所示:

SELECT id,value,date

(SELECT id,value,date
,ROW_NUMBER()OVER(PAR BY BY BY ORDER BY date DESC)AS RowNum
从表
)AS x
RowNum = 1


如果您的数据库支持Row_number,请使用它

1
2
3
4
5
6
7
SELECT id,VALUE,DATE FROM
(
SELECT ROW_NUMBER() OVER(partition BY VALUE ORDER BY DATE DESC) AS RN,
       id,VALUE,DATE
FROM yourtable
) A
WHERE RN=1

另一种方法是将结果加回到表中。

1
2
3
4
5
6
7
8
9
10
SELECT A.id,
       A.value,
       A.date
FROM   yourtable A
       INNER JOIN (SELECT MAX(DATE) AS DATE,
                          VALUE
                   FROM   yourtable
                   GROUP  BY VALUE) B
               ON A.date = b.date
                  AND A.value = B.value