【问题标题】:Getting most recent date values where other column values change [duplicate]获取其他列值更改的最新日期值[重复]
【发布时间】:2015-11-03 22:14:10
【问题描述】:

我有一张如下表:

  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 的最新映射

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

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

我似乎无法理解如何完成此操作

select max(date) 

只返回最新的日期值

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

【问题讨论】:

  • 您使用的是哪个 RDBMS
  • 我需要结果中的 ID 和值列
  • 我正在使用 PostgreSQL

标签: sql postgresql date max


【解决方案1】:

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

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 和窗口函数的东西。你也可以把它写成这样的派生表:

选择 ID、值、日期 从 (选择 id、值、日期 , ROW_NUMBER() OVER (PARTITION BY id ORDER BY date DESC) AS RowNum 从表 ) 作为 x WHERE RowNum = 1

【讨论】:

    【解决方案2】:

    如果你的数据库支持Row_number,那么就使用这个

    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
    

    另一种方法是将结果连接回表格。

    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 
    

    【讨论】:

      【解决方案3】:

      简单

      SELECT DISTINCT ON (id) *
      FROM   tbl
      ORDER  BY id, date DESC NULLS LAST;
      

      详细解释:

      快速

      对于每个 id 具有 许多 行的数据分布:

      【讨论】:

        猜你喜欢
        • 2021-11-25
        • 1970-01-01
        • 1970-01-01
        • 2021-04-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多