sql - PostgreSQL:如何返回与找到的行相关的行(相对结果)?

标签 sql postgresql

如果我的例子没有意义,请原谅我。我将尝试使用简化版来鼓励更多参与。

考虑如下表格:

  •        dt     |    mnth    |  foo
    --------------+------------+--------
      2012-12-01  |  December  |
        ...
      2012-08-01  |  August    |
      2012-07-01  |  July      |
      2012-06-01  |  June      |
      2012-05-01  |  May       |
      2012-04-01  |  April     |
      2012-03-01  |  March     |
        ...
      1997-01-01  |  January   |  
    

如果您寻找 dt 最接近今天的记录,而没有过去,那么最好的方法是预先返回 3 条记录7 条记录之后?

我决定试试窗口函数:

  • WITH dates AS (
       select  row_number() over (order by dt desc)
             , dt
             , dt - now()::date as dt_diff
       from    foo
    )
    , closest_date AS (
       select * from dates
       where dt_diff = ( select max(dt_diff) from dates where dt_diff <= 0 )
    )
    
    SELECT * 
    FROM   dates
    WHERE  row_number - (select row_number from closest_date) >= -3
       AND row_number - (select row_number from closest_date) <=  7 ;
    

我觉得一定有更好的方法来使用窗口函数返回相关记录,但我已经有一段时间没看过它们了。

最佳答案

create table foo (dt date);
insert into foo values
('2012-12-01'),
('2012-08-01'),
('2012-07-01'),
('2012-06-01'),
('2012-05-01'),
('2012-04-01'),
('2012-03-01'),
('2012-02-01'),
('2012-01-01'),
('1997-01-01'),
('2012-09-01'),
('2012-10-01'),
('2012-11-01'),
('2013-01-01')
;

select dt
from (
(
    select dt
    from foo
    where dt <= current_date
    order by dt desc
    limit 4
)
union all
(
    select dt
    from foo
    where dt > current_date
    order by dt
    limit 7
)) s
order by dt
;
     dt     
------------
 2012-03-01
 2012-04-01
 2012-05-01
 2012-06-01
 2012-07-01
 2012-08-01
 2012-09-01
 2012-10-01
 2012-11-01
 2012-12-01
 2013-01-01
(11 rows)

关于sql - PostgreSQL:如何返回与找到的行相关的行(相对结果)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10906206/

相关文章:

php - 将查询数量从 2 减少到 1

postgresql - postgresql 中的动态更新

sql - 反序列化 SQL 数据库中的数据

mysql - 同一属性 : null entries, EAV 存在多种可能的数据类型,还是存储为 varchar?

php - 如何使用 php 5.5.17 像 JSON for Google 图表一样从 postgres 9.5 中排列结果

python - 是否需要在脚本结束时关闭 Psycopg2 连接?

sql - 使用 PostgreSQL 选择一棵树并对 child 进行排序

sql - 组合两个具有多个粒度级别的表

sql - ORA-02264 : name already used by an existing constraint

javascript - ajax 与数据库查询和显示/隐藏表行