Выберите минимальную дату в предложении WHERE - PullRequest
1 голос
/ 23 апреля 2019

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

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

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

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

Ответы [ 2 ]

1 голос
/ 23 апреля 2019

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

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)

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

1 голос
/ 23 апреля 2019

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

... WHERE type = 'baseline' OR (type = 'fol' AND date <= (SELECT MIN(data) FROM ... WHERE type = 'baseline') )
...