sql如何获取数据库中最新的数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql如何获取数据库中最新的数据相关的知识,希望对你有一定的参考价值。

参考技术A elect A.userid ,max(B.userid) form A,B where A.id = B.id(+)

如何在 SQL 中获取最新的非负值?

【中文标题】如何在 SQL 中获取最新的非负值?【英文标题】:How to get the latest non-negative value in SQL? 【发布时间】:2021-11-06 01:55:07 【问题描述】:

我有以下数据集。

date orig dest value
11-4 S8 B9 -42
10-30 S8 B9 -2999
10-15 S8 B9 959
10-14 S8 B9 480
10-13 S8 B9 0
10-9 S8 B9 503

我怎样才能把它变成这样的东西?

date orig dest value new value
11-4 S8 B9 -42 959
10-30 S8 B9 -2999 959
10-15 S8 B9 959 959
10-14 S8 B9 480 480
10-13 S8 B9 0 503
10-9 S8 B9 503 503

这是我用过的,不正确:

CASE WHEN value <= 0
     THEN last_value(value) over (PARTITION BY orig, dest ORDER BY date DESC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
     ELSE value 
END as new_value

这里的目标是不要用最近的最大值替换

【问题讨论】:

【参考方案1】:

这应该在 Redshift 中完成:

SELECT date, orig, dest, value
     , max(value) OVER (PARTITION BY orig, dest, grp) AS new_value
FROM  (
   SELECT date, orig, dest, value
        , count(value > 0 OR NULL) OVER (PARTITION BY orig, dest ORDER BY date) AS grp
   FROM   tbl
   ) sub

解释:

Retrieve last known value for each column of a row

关于count(expression OR NULL),见:

For absolute performance, is SUM faster or COUNT?

不幸的是,Redshift 没有跟上对 Postgres 的改进,并且缺少聚合的 FILTER 子句(自 Postgres 9.4 起!),这会更快、更优雅:

SELECT date, orig, dest, value
     , max(value) OVER (PARTITION BY orig, dest, grp) AS new_value
FROM  (
   SELECT date, orig, dest, value
        , count(*) FILTER (WHERE value > 0) OVER (PARTITION BY orig, dest ORDER BY date) AS grp
   FROM   tbl
   ) sub

见:

Get max value from a window of rows as new column for all rows Aggregate columns with additional (distinct) filters

【讨论】:

以上是关于sql如何获取数据库中最新的数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL 中以高性能的方式使用 PARTITION BY 获取最新记录?

SQL - 如何获取创建的同一日期的最新数据

SQL Server:从最大日期/最新日期的记录中获取数据

sql语句获取表中最新数据

SQL查询以逐块获取最新数据

SQL查询从数据中获取最新价格?