T-SQL получить все записи после определенной даты, а также фиксированное число до в одном запросе? - PullRequest
0 голосов
/ 17 мая 2018

Пример таблицы данных:

eventDate           eventText
------------------- ----------
2018-05-01 12:00:00 Some event
2018-05-02 13:00:00 Some event
2018-05-03 11:00:00 Some event
2018-05-04 11:00:00 Some event
2018-05-05 15:00:00 Some event
2018-05-06 14:00:00 Some event
2018-05-07 17:00:00 Some event
2018-05-08 16:00:00 Some event
2018-05-09 12:00:00 Some event
2018-05-10 11:00:00 Some event

Я хочу получить ВСЕ записи после определенной даты, но ТАКЖЕ записи до этой даты до определенного максимального количества записей.

ИтакНапример, допустим, я запрашиваю все записи в 2018-05-05 или позже.

SELECT * FROM myTable WHERE eventDate >= '2018-05-05' ORDER BY eventDate

eventDate           eventText
------------------- ----------
2018-05-05 15:00:00 Some event
2018-05-06 14:00:00 Some event
2018-05-07 17:00:00 Some event
2018-05-08 16:00:00 Some event
2018-05-09 12:00:00 Some event
2018-05-10 11:00:00 Some event

Но теперь я хочу включить, в тот же результат запроса , максимум две записи до даты 2018-05-05.Итак:

SELECT * FROM myTable WHERE eventDate >= '2018-05-05' ORDER BY eventDate -- pseudocode "AND OR eventDate < 2018-05-05 WITH MAXIMUM EXTRA RECORDS 2

eventDate           eventText
------------------- ----------
2018-05-03 11:00:00 Some event
2018-05-04 11:00:00 Some event
2018-05-05 15:00:00 Some event
2018-05-06 14:00:00 Some event
2018-05-07 17:00:00 Some event
2018-05-08 16:00:00 Some event
2018-05-09 12:00:00 Some event
2018-05-10 11:00:00 Some event

Максимальное количество записей - максимум, поэтому, если нет достаточного количества записей, это нормально и не должно быть ошибки:

SELECT * FROM myTable WHERE eventDate >= '2018-05-02' ORDER BY eventDate -- pseudocode "AND OR eventDate < 2018-05-02 WITH MAXIMUM EXTRA RECORDS 10

eventDate           eventText
------------------- ----------
2018-05-01 12:00:00 Some event
2018-05-02 13:00:00 Some event
2018-05-03 11:00:00 Some event
2018-05-04 11:00:00 Some event
2018-05-05 15:00:00 Some event
2018-05-06 14:00:00 Some event
2018-05-07 17:00:00 Some event
2018-05-08 16:00:00 Some event
2018-05-09 12:00:00 Some event
2018-05-10 11:00:00 Some event

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

SELECT * FROM myTable WHERE eventDate >= '2018-06-30' ORDER BY eventDate -- pseudocode "AND OR eventDate < 2018-06-30 WITH MAXIMUM EXTRA RECORDS 2

eventDate           eventText
------------------- ----------
2018-05-09 12:00:00 Some event
2018-05-10 11:00:00 Some event

Можно ли сделать это одним запросом?

Также желательно сделать это без хранимой процедуры или функции, если это возможно.

Вариант использования - это API, который будет возвращать «список всех текущих и будущих записей, включая самые последние две предыдущие записи до текущего времени»

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Дайте чек Гордону

Но это может быть немного проще:

declare @dt datetime = '2018-06-30'

SELECT t.*
FROM (   SELECT t.*
         FROM myTable t
         WHERE eventDate >= @dt
       UNION ALL
       ( SELECT TOP(2) t.*
         FROM myTable t
         WHERE eventDate < @dt
         ORDER BY eventDate DESC
       )
     ) t
ORDER BY t.eventDate;
0 голосов
/ 17 мая 2018

Вы, кажется, хотите:

SELECT t.*
FROM ((SELECT t.*
       FROM myTable t
       WHERE eventDate >= '2018-05-05'
       ORDER BY eventDate
      ) UNION ALL
      (SELECT TOP (2) t.*
       FROM myTable t
       WHERE eventDate < '2018-05-05'
       ORDER BY eventDate DESC
      )
     ) t
ORDER BY eventDate;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...