У кого-нибудь есть какие-либо идеи о том, как выбрать x количество непоследовательных дней данных? Даты стандартные sql datetime. Так, например, я хотел бы выбрать данные за последние 5 дней, но между записями может быть многодневный разрыв, поэтому просто выбрать записи, сделанные 5 дней назад и более поздние, не годится.
Выберите X самых последних непоследовательных дней, достойных данных
comment
Мне кажется, что либо очень рано и я еще не пил кофе, либо мне нужно больше информации, чтобы попытаться вам помочь. Является ли дата единственным параметром? Можете ли вы вернуть все, что он находит для этих дат?
- person GregD   schedule 21.11.2008
Ответы (3)
Следуя подходу, предложенному Тони Эндрюсом , вот способ сделать это в T-SQL:
SELECT
Value,
ValueDate
FROM
Data
WHERE
ValueDate >=
(
SELECT
CONVERT(DATETIME, MIN(TruncatedDate))
FROM
(
SELECT DISTINCT TOP 5
CONVERT(VARCHAR, ValueDate, 102) TruncatedDate
FROM
Event
ORDER BY
TruncatedDate DESC
) d
)
ORDER BY
ValueDate DESC
person
Tomalak
schedule
21.11.2008
Я не знаю синтаксиса SQL Server, но вам нужно:
1) Выберите даты (с усеченным компонентом времени) в порядке убывания
2) Отобрать топ 5
3) Получить 5-е значение
4) Выберите данные, где дата и время> = 5-е значение
Что-то вроде этого "псевдо-SQL":
select *
from data
where datetime >=
( select top 1 date
from
( select top 5 date from
( select truncated(datetime) as date
from data
order by truncated(datetime) desc
)
order by date
)
)
person
Tony Andrews
schedule
21.11.2008
У меня плохое предчувствие, что этот механизм окажется менее эффективным, чем должен быть.
- person Brian; 21.11.2008
Имейте вычисляемый столбец для TruncatedDate и индекс для него. Затем выбор DISTINCT TOP 5 ORDER BY должен быть простым, и вы можете сразу же использовать возвращенное значение для эффективной фильтрации.
- person Tomalak; 21.11.2008
Это должно сделать это и быть достаточно хорошим с точки зрения производительности. Вы не упомянули, как обрабатывать связи, поэтому вы можете добавить предложение WITH TIES, если вам это нужно.
SELECT TOP (@number_to_return)
* -- Write out your columns here
FROM
dbo.MyTable
ORDER BY
MyDateColumn DESC
person
Tom H
schedule
21.11.2008