Выберите минимальную дату в разделе WHERE

С точки зрения PostgreSQL: у меня есть набор данных, который состоит из значений индикаторов, временных меток и флага, указывающего, относятся ли значения индикатора к базовому или последующему периоду.

Я хочу выбрать все строки из базового периода И первую строку из последующего периода. Я не могу использовать MIN (дату) в предложении WHERE, и это не значит, что последующий период всегда будет начинаться в одну и ту же дату во всех случаях.

Есть ли способ сделать что-то вроде WHERE type = 'baseline' OR (type = 'fol' AND date <= MIN(date))?

С точки зрения надмножества: я использую слой аннотации, чтобы выделить часть линии индикатора, которая представляет базовый период. Затем я выделяю последующий период другим цветом. Мне нужно убедиться, что выделение выполняется непрерывно (прямо сейчас сегмент линии между базовой датой последней даты и последующей последней датой не выделен). Итак, мне нужно применить фильтр к диаграмме, лежащей в основе слоя аннотации выделения базовой линии, который возвращает данные за базовый период И первую последующую дату.


person Clay Crosby    schedule 23.04.2019    source источник


Ответы (2)


Как я вижу, есть несколько способов сделать это:

1) Используйте UNION, чтобы создать два отдельных запроса

select <Query> where type = 'baseline'
UNION ALL
select <Query> where type = 'fol' order by date limit 1

2) Используйте предложение where, которое вы написали, но вычислите дату в подзапросе, как в ответе @Kushal Arya

3) Используйте оконную функцию ROW_NUMBER

select
    <Query>,
    ROW_NUMBER() over (partition by type
                       order by date) as row_num
where
  type = 'baseline' OR
  (type = 'fol' AND row_num = 1)

Я не запускал эти запросы

person Antigluk    schedule 23.04.2019
comment
Спасибо! Поскольку я использую Superset, оконная функция самая простая. - person Clay Crosby; 23.04.2019

Вы не можете использовать агрегатные функции внутри предложения WERE. Вместо этого используйте подзапросы

... WHERE type = 'baseline' OR (type = 'fol' AND date <= (SELECT MIN(data) FROM ... WHERE type = 'baseline') )
person Kushal Arya    schedule 23.04.2019
comment
Спасибо за ответ. Это определенно работает при тестировании. К сожалению, из-за программного обеспечения для визуализации данных я работаю с предложением использовать функцию окна, приведенную ниже, кажется, лучше всего для моего конкретного случая использования. - person Clay Crosby; 23.04.2019