Кто-нибудь получил какое-то представление о том, как выбрать x количество данных за непоследовательные дни? Даты стандартны для sql datetime. Так, например, я хотел бы выбрать данные за 5 последних дней, но между записями может быть разрыв в несколько дней, поэтому просто выбрать записи, сделанные 5 дней назад и более свежие, не годится.


Я не знаю синтаксиса SQL Server, но вам необходимо:
1) Выберите даты (с усеченным компонентом времени) в порядке убывания.
2) Снимите 5 лучших
3) Получить 5-е значение
4) Выберите данные, где datetime> = 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
)
)
У меня плохое предчувствие, что этот механизм окажется менее эффективным, чем должен быть.
Имейте вычисляемый столбец для TruncatedDate и индекс по нему. Тогда выбор DISTINCT TOP 5 ORDER BY должен быть несложным, и вы можете сразу же использовать возвращенное значение для эффективной фильтрации.
Следуя подходу, предложенному Тони Эндрюс, вот способ сделать это в 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
Это должно работать и быть достаточно хорошим с точки зрения производительности. Вы не упомянули, как обрабатывать связи, поэтому вы можете добавить предложение WITH TIES, если вам это нужно.
SELECT TOP (@number_to_return)
* -- Write out your columns here
FROM
dbo.MyTable
ORDER BY
MyDateColumn DESC
Мне кажется, либо очень рано, и я еще не пил кофе, либо мне нужно больше информации, чтобы попытаться вам помочь. Дата - единственный параметр? Можете ли вы вернуть все, что он найдет на эти даты?