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

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

Мне кажется, либо очень рано, и я еще не пил кофе, либо мне нужно больше информации, чтобы попытаться вам помочь. Дата - единственный параметр? Можете ли вы вернуть все, что он найдет на эти даты?

GregD 21.11.2008 15:58
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
1
653
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Я не знаю синтаксиса 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
  )
)

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

Brian 21.11.2008 16:43

Имейте вычисляемый столбец для TruncatedDate и индекс по нему. Тогда выбор DISTINCT TOP 5 ORDER BY должен быть несложным, и вы можете сразу же использовать возвращенное значение для эффективной фильтрации.

Tomalak 21.11.2008 19:31
Ответ принят как подходящий

Следуя подходу, предложенному Тони Эндрюс, вот способ сделать это в 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

Другие вопросы по теме