Выберите X самых последних непоследовательных дней, достойных данных

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


person jdee    schedule 21.11.2008    source источник
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
comment
У меня плохое предчувствие, что этот механизм окажется менее эффективным, чем должен быть. - person Brian; 21.11.2008
comment
Имейте вычисляемый столбец для 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