Возвращение строк, где предложение WHERE не было точным соответствием - PullRequest
0 голосов
/ 04 декабря 2018

Я заранее прошу прощения за название вопроса.Я действительно изо всех сил пытался написать что-то сжатое!

У меня есть таблица, подобная следующей:

| Item    | Date       | Value |
| A       | 2018-12-01 | 1     |
| B       | 2018-12-01 | 2     |
| C       | 2018-12-01 | 2     |
| A       | 2018-12-02 | 3     |
| B       | 2018-12-02 | 3     |

Я хотел бы написать запрос так, чтобы, когда я даю ему конкретную дату, онвозвращает одну строку для каждого уникального Item в таблице, и это Value на данную дату, или, если она не наблюдалась на данную дату, в последний раз, когда она наблюдалась .

Таким образом, в приведенной выше таблице, если я поставлю 2018-12-01, он вернется:

| Item    | Date       | Value |
| A       | 2018-12-01 | 1     |
| B       | 2018-12-01 | 2     |
| C       | 2018-12-01 | 2     |

, но если я поставлю 2018-12-02, он вернется:

| Item    | Date       | Value |
| A       | 2018-12-02 | 3     |
| B       | 2018-12-02 | 3     |
| C       | 2018-12-01 | 2     |

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Один из подходов может заключаться в том, чтобы запросить все строки в или до этой даты, а затем использовать оконную функцию rank для получения первой строки для каждого элемента:

SELECT item, date, value
FROM   (SELECT item, date, value, RANK() OVER (PARTITION BY item ORDER BY date DESC) AS rk
        FROM   mytable
        WHERE  date <= :param_date) t
WHERE  rk = 1
0 голосов
/ 04 декабря 2018

Вы можете использовать distinct on:

select distinct on (item) t.*
from t
where date <= $your_date
order by item, date desc;
...