SQL: мне нужно выбрать, где три строки одинаковы в последовательных датах

У меня есть таблица с идентификатором PersonID, ItemID, Quantity и DateBought в качестве столбцов. Мне нужно выбрать строки, где PersonID, ItemID и Quantity совпадают, а DateBought – в последовательные дни.

Вот некоторые примеры данных

PersonID ItemID Quantity DateBought 1 A 1 2015-02-01 1 A 1 2015-02-02 2 B 2 2015-02-01 2 B 1 2015-02-02 3 C 2 2015-02-01 3 C 2 2015-02-01 4 D 1 2015-02-01 4 E 1 2015-02-02 5 G 7 2015-09-21 5 G 7 2015-09-22 

В этой ситуации я бы хотел выбрать PersonID = 1 и PersonID = 5, а другие нет (2 имеет значения diff, 3 – в тот же день, 4 разных элемента).

Я думаю, что это самый простой запрос

 SELECT * FROM table_name GROUP BY PersonID, ItemID, Quantity ORDER BY DateBought ASC; 

Используйте MySQL GROUP BY или ORDER BY : –

  SELECT * FROM table_name GROUP BY PersonID, ItemID, Quantity ORDER BY DateBought DEsc; 

Попробуй это:

 select * from tablename t1 inner join tablename t2 on t1.personID = t2.personID and t1.ItemID = t2.ItemID and t1.Quantity= t2.Quantity 
 WITH t AS ( SELECT DateBought d,ROW_NUMBER() OVER(ORDER BY DateBought) i FROM @d GROUP BY DateBought ) SELECT MIN(d),MAX(d) FROM t GROUP BY DATEDIFF(day,i,d) 

Используя этот u, вы получите min_date и max_date из столбца DateBought после того, как вам просто нужно исправить другие значения, как вы хотите, из таблицы, используя простое условие.

Метод Tabibitosan (см. https://community.oracle.com/message/3996302 ) должен сделать трюк … Предполагая, что ваши данные хранятся в таблице temp, например «#temp», SQL будет:

 Select a.* from ( Select PersonID , ItemID , Quantity , MIN(DateBought) as minDat , MAX(DateBought) as maxDat from ( Select PersonID , ItemID , Quantity , DateBought , DATEDIFF(day,STR(YEAR(DateBought),4)+'0101',DateBought)+1 - ROW_NUMBER() over(order by PersonID, DateBought) as distance from #temp ) as a group by distance , PersonID , ItemID , Quantity ) as a where abs(DATEDIFF(dd, minDat, maxDat)) >= 2 

Ну вот. abs может не понадобиться [DateDiff].

 if object_id('tempdb..#Test') is not null drop table #Test; select * into #Test from ( select 1 as PersonId, 'A' as ItemId, 1 as Quantity, cast('2015-02-01' as date) as DateBought union all select 1 as PersonId, 'A' as ItemId, 1 as Quantity, cast('2015-02-02' as date) as DateBought union all select 2 as PersonId, 'B' as ItemId, 2 as Quantity, cast('2015-02-01' as date) as DateBought union all select 2 as PersonId, 'B' as ItemId, 1 as Quantity, cast('2015-02-02' as date) as DateBought union all select 3 as PersonId, 'C' as ItemId, 2 as Quantity, cast('2015-02-01' as date) as DateBought union all select 3 as PersonId, 'C' as ItemId, 2 as Quantity, cast('2015-02-01' as date) as DateBought union all select 4 as PersonId, 'D' as ItemId, 1 as Quantity, cast('2015-02-01' as date) as DateBought union all select 4 as PersonId, 'E' as ItemId, 1 as Quantity, cast('2015-02-02' as date) as DateBought union all select 5 as PersonId, 'G' as ItemId, 7 as Quantity, cast('2015-09-21' as date) as DateBought union all select 5 as PersonId, 'G' as ItemId, 7 as Quantity, cast('2015-09-22' as date) as DateBought)a select PersonId , ItemId , Quantity , DateBought from ( select PersonId , ItemId , Quantity , DateBought , abs(datediff(DAY, lead(DateBought) over (Partition by PersonId, ItemId, Quantity order by DateBought desc), DateBought)) as [DateDiff] from #Test ) Results where Results.[DateDiff]= 1 

попробуй это

 select a.* from sample a,sample b where a.personid=b.personid and a.itemid=b.itemid and a.datebought=(b.datebought)-1 union select b.* from sample a,sample b where a.personid=b.personid and a.itemid=b.itemid and b.datebought=(a.datebought)+1; 

вывод :

 PersonID ItemID Quantity DateBought 1 A 1 2015-02-01 1 A 1 2015-02-02 5 G 7 2015-09-21 5 G 7 2015-09-22 
  • Реальный проект, когда максимальное значение maxint может быть достигнуто
  • Когда лучше не использовать внутреннее соединение?
  • SQL - выбор нескольких столбцов с предложением WHERE IN
  • Совместимость SQL-Server и MySQL?
  • Как использовать MySQL и MSSQL вместе в источнике данных grails?
  • Решающая потребность в базе данных
  • Новый вопрос о транзакциях с базой данных
  • Как обновить интервал дат в базе данных (Hibernate HQL)
  • Большое поле varchar вызывает ошибку «Запрошенное преобразование не поддерживается», используя openquery с подключенным сервером MySQL
  • Ошибка при использовании Inner Join Query при соединении трех трех таблиц
  • Безопасность клиента / сервера в C # / SQL Server
  • Interesting Posts

    конвертировать одну строку в столбцы

    Соединение пустой таблицы для возврата всех строк

    Необходимо устранить последние 4 символа в строке (varchar)

    Журнал SQL Server: «Неверная операция с плавающей запятой» – хотя вход находится в пределах диапазона

    Группировать по дате без времени

    разделенные запятыми имена на основе идентификатора компании

    Фильтрация повторяющихся строк на основе поля

    Кросс применяется как для скалярнозначных, так и для табличных функций

    SQL: использование внешнего соединения в SQL Server 2012

    Эффективные последствия комментариев в хранимых процедурах SQL

    datetime to totalminute в sql

    Что лучше всего использовать для миграции локального SQL Server на Azure VM – работы динамического SQL-агента в приложении AlwaysOn

    Как я могу использовать T-SQL для поиска всех позиций, которые не входят в список символов?

    Как создать механизм правил?

    Найти все строки с нулевыми значениями в любой колонке

    Давайте будем гением компьютера.