SQL извлекает все строки между двумя датами и указанным c числом строк до даты, упорядоченной по дате - PullRequest
0 голосов
/ 18 февраля 2020

Как видно из заголовка, у меня есть таблица со столбцом даты. Я пытаюсь получить все строки между 2 датами, а также количество строк X до начальной даты, упорядоченной по дате.

Выполнить выборку * из таблицы по дате DS C

20200201
20200101
20191201
20191101
20191001
20190901
20190801
20190701

Я хочу, чтобы между 20200201 и 20191201 и предыдущими 3 строками (не зная даты)

result
20200201
20200101
20191201
20191101
20191001
20190901

мой текущий запрос по произвольной причине возвращает случайный набор старших дат между объединением:

(SELECT * FROM Table WHERE Date BETWEEN 20200201 AND 20191201 ORDER BY Date ASC)
UNION
(SELECT * FROM Table WHERE Date < 20191201 ORDER BY Date DESC LIMIT 3)

Есть идеи, где я иду не так?

Ответы [ 3 ]

0 голосов
/ 18 февраля 2020

Один метод использует lead():

select t.*
from (select t.*,
             lead(date, 3) over (order by date) as next_date_3
      from t
     ) t
where (date < '202o-02-01' and (next_date_3 >= '2020-02-01' or next_date_3 is null) ) or
      (date between '2020-02-01' and '2019-12-01')
0 голосов
/ 19 февраля 2020

Как указывал Джарл, проблема была в том, что порядок подзапросов не был сохранен (вот почему все перемешалось), и простой ORDER BY всего UNION это исправил. Я не пробовал ответить Гордона, так как это решило мою проблему так:

(SELECT * FROM Table WHERE Date BETWEEN  20191201 AND 20200201)
UNION
(SELECT * FROM Table WHERE Date < 20191201 ORDER BY Date DESC LIMIT 3)
ORDER BY Date ASC

Спасибо

0 голосов
/ 18 февраля 2020

Я пробовал этот запрос, и он работал для меня:

(SELECT * FROM Table WHERE Date BETWEEN  20191201 AND 20200201 ORDER BY Date ASC)
UNION
(SELECT * FROM Table WHERE Date < 20191201 ORDER BY Date DESC LIMIT 3)

Первый выбор показывает мне:

20191201
20200101
20200201

Второй выбор показывает мне:

20191101 
20191001 
20190901 
...