sql - 从sql中的当前时间戳中选择最后一个和接下来的五个

标签 sql postgresql timestamp sql-order-by

我有一个表(order_id,时间戳)。时间戳表示订单交货日期,这可能发生在未来。我如何使用一个选择语句从现在开始获取最后 5 个订单和从现在开始的下 5 个订单?是否可以在不使用联合查询的情况下在 sql 中执行此操作?像这样,但没有工会:

select * from table where timestamp <= current_timestamp
order by timestamp desc limit 5
union
select * from table where timestamp >= current_timestamp
order by timestamp asc limit 5

最佳答案

我认为我们可以用 window function 来做到这一点:

WITH Numbered AS (
   SELECT
       *, --TODO, pick columns
       ROW_NUMBER() OVER (ORDER BY CASE WHEN timestamp < current_timestamp THEN timestamp ELSE '18000101' END desc) as HistoricRN,
       ROW_NUMBER() OVER (ORDER BY CASE WHEN timestamp >= current_timestamp THEN timestamp ELSE '99991231' END) as FutureRN
    FROM table
)
SELECT
   * --TODO, pick columns
from Numbered
where HistoricRN between 1 and 5 or FutureRN between 1 and 5

请注意,我已经武断地决定,如果时间戳完全匹配,它将出现在未来的行中。您的原始查询将它放在两个组中(但 UNION 会消除它),因此如果时间戳完全匹配,您的查询将返回 9 行而不是 10 行。

关于sql - 从sql中的当前时间戳中选择最后一个和接下来的五个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5646833/

相关文章:

mysql - 如何计算和连接来自不同数据库的 mySQL 上的两个表?

mysql - 优化返回大量记录的查询,一种避免数百个连接的方法。这是一个聪明的解决方案吗?

sql - 在 SQL Server 2008 中区分两个表模式的最简单方法?

PostgreSQL 8.4 将所有表的 DML 权限授予一个角色

postgresql - Postgres : difference between two timestamps (hours:minutes:seconds)

postgresql - 将 GeoLocation Twitter4J 写入 Postgres

c - tcp时间戳,记录返回回复所需的时间

c# - Sql查询到linq的转换

python - 如何在 pandas 数据框上计算一天的小时数

java - Java 中日历的字符串时间戳?