У меня есть таблица с идентификатором, значением и датой. В этой таблице много идентификаторов, значений и дат.
Записи вставляются в эту таблицу периодически. Идентификатор всегда будет оставаться неизменным, но иногда значение будет меняться.
Как я могу написать запрос, который даст мне идентификатор плюс самое последнее время, когда значение изменилось? Примечание: значение всегда будет увеличиваться.
Из этого примера данных:
Create Table Taco
( Taco_ID int,
Taco_value int,
Taco_date datetime)
Insert INTO Taco
Values (1, 1, '2012-07-01 00:00:01'),
(1, 1, '2012-07-01 00:00:02'),
(1, 1, '2012-07-01 00:00:03'),
(1, 1, '2012-07-01 00:00:04'),
(1, 2, '2012-07-01 00:00:05'),
(1, 2, '2012-07-01 00:00:06'),
(1, 2, '2012-07-01 00:00:07'),
(1, 2, '2012-07-01 00:00:08')
Результат должен быть:
Taco_ID Taco_date
1 2012-07-01 00:00:05
(Потому что 00:05 последний раз Taco_Value
меняли.)
sql-server
sql-server-2008-r2
t-sql
SqlSandwiches
источник
источник
taco
, не имеет ничего общего с едой?Ответы:
Эти два запроса основаны на предположении, которое
Taco_value
всегда увеличивается со временем.Альтернатива с меньшим количеством безумных оконных функций:
Примеры в SQLfiddle
Обновить
Для тех, кто следил, был спор о том, что произойдет, если
Taco_value
когда-либо может повториться Если он может перейти от 1 к 2, а затем обратно к 1 для любого заданногоTaco_ID
, запросы не будут работать. Вот решение для этого случая, даже если это не совсем техника пробелов и островков, о которой может мечтать кто-то вроде Ицик Бен-Гана, и даже если это не имеет отношения к сценарию ОП - это может быть отношение к будущему читателю. Это немного сложнее, и я также добавил дополнительную переменную -Taco_ID
которая есть только в однойTaco_value
.Если вы хотите включить первую строку для любого идентификатора, значение которого не изменилось вообще во всем наборе:
Если вы хотите исключить эти строки, это немного сложнее, но все же незначительные изменения:
Обновленные примеры SQLfiddle
источник
value
снова: FiddleПо сути, это предложение @ Taryn, «сжатое» до одного SELECT без производных таблиц:
Примечание: это решение учитывает условие, которое
Taco_value
может только увеличиться. (Точнее, он предполагает, чтоTaco_value
не может вернуться к предыдущему значению - так же, как и связанный ответ, на самом деле.)Демонстрация SQL Fiddle для запроса: http://sqlfiddle.com/#!3/91368/2
источник
Вы должны быть в состоянии использовать обе
min()
иmax()
агрегатные функции, чтобы получить результат:Смотрите SQL Fiddle с демо
источник
Еще один ответ, основанный на предположении, что значения не появляются снова (это в основном запрос @ Aaron 2, сжатый в одном меньшем гнезде):
Тест в: SQL-Fiddle
И ответ на более общую проблему, где значения могут появиться снова:
(или используя
CROSS APPLY
так, чтобы отобразилась вся связанная строка, включаяvalue
,):Тест в: SQL-Fiddle-2
источник
dbo.Taco UNION ALL SELECT DISTINCT Taco_ID, NULL AS Taco_value, '19000101' AS Taco_date
).К вашему сведению +1 за предоставление структуры выборки и данных. Единственное, что я мог бы попросить, это ожидаемый результат для этих данных.
РЕДАКТИРОВАТЬ: Этот собирался сводить меня с ума. У меня только что появился "простой" способ сделать это. Я избавился от неправильных решений и поставил одно, которое считаю верным. Вот решение, похожее на @bluefeets, но оно охватывает тесты, которые дал @AaronBertrand.
источник
value
изменения.Почему бы просто не получить разницу между значением задержки и значением опережения? если разница равна нулю, она не изменилась, если она не равна нулю, то изменилась. Это можно сделать простым запросом:
источник
lag...
Аналитическая функция только была «недавно» введена в SQL Server 2012. Оригинальный вопрос просит решения на SQL Server 2008 R2. Ваше решение не будет работать для SQL Server 2008 R2.Может ли это быть так просто, как показано ниже?
Учитывая, что taco_value всегда увеличивается?
PS Я сам начинающий SQL, но учусь медленно, но верно.
источник
Cannot perform an aggregate function on an expression containing an aggregate or a subquery