я пишу SQL запросов для отображения различных типов результатов согласно следующим ТРЕБОВАНИЯМ:Sql Server - самый быстрый способ получить количество раз значение изменилось для каждого ID
- Дисплей записи, который значение изменилось с 1 до 0, максимальное время в заданном временном метки
- записи Показать, кто значение изменяется от 1 до 0, минимального времени в данном временной метке
- Показать 10 лучшие записей, который значение изменилось с 1 до 0 , Максимальное время в заданной временной метки
Образец данных:
+----------+-------------+-------------+ | DeviceId | CaptureTime | SensorValue | +----------+-------------+-------------+ | DC001 | 02/01/2017 | 0 | | DC001 | 02/02/2017 | 1 | | DC001 | 02/03/2017 | 0 | | DC001 | 02/04/2017 | 1 | | DC001 | 02/05/2017 | 0 | | DC001 | 02/07/2017 | 1 | | DC001 | 02/08/2017 | 0 | | DC001 | 02/10/2017 | 1 | | DC001 | 02/01/2017 | 0 | | DC001 | 02/01/2017 | 0 | | DC002 | 02/02/2017 | 1 | | DC002 | 02/02/2017 | 0 | | DC002 | 02/02/2017 | 1 | | DC002 | 02/02/2017 | 1 | | DC002 | 02/02/2017 | 1 | | DC002 | 02/03/2017 | 1 | | DC002 | 02/03/2017 | 0 | | DC002 | 02/03/2017 | 0 | | DC002 | 02/03/2017 | 1 | | DC002 | 02/03/2017 | 1 | | DC003 | 02/03/2017 | 1 | | DC003 | 02/03/2017 | 1 | | DC003 | 02/03/2017 | 0 | | DC003 | 02/03/2017 | 1 | | DC003 | 02/03/2017 | 1 | | DC003 | 02/04/2017 | 1 | | DC003 | 02/05/2017 | 1 | | DC003 | 02/06/2017 | 1 | | DC003 | 02/07/2017 | 1 | | DC003 | 02/08/2017 | 1 | | DC004 | 02/09/2017 | 0 | | DC004 | 02/10/2017 | 0 | | DC004 | 02/11/2017 | 1 | | DC004 | 02/12/2017 | 0 | | DC004 | 02/12/2017 | 1 | | DC004 | 02/12/2017 | 1 | | DC004 | 02/12/2017 | 1 | | DC004 | 02/12/2017 | 1 | | DC004 | 02/12/2017 | 1 | | DC004 | 02/12/2017 | 1 | | DC005 | 02/12/2017 | 0 | | DC005 | 02/12/2017 | 0 | | DC005 | 02/12/2017 | 0 | | DC005 | 02/12/2017 | 0 | | DC005 | 02/14/2017 | 0 | | DC005 | 02/14/2017 | 0 | | DC005 | 02/14/2017 | 0 | | DC005 | 02/14/2017 | 0 | | DC005 | 02/14/2017 | 0 | | DC005 | 02/14/2017 | 0 | +----------+-------------+-------------+
Я создал ниже общий запрос для всех трех требований:
DECLARE @HoursBack INT
, @MinMax VARCHAR(3)
, @TopRows INT
SELECT TOP (@TopRows) COUNT(TD1.DeviceId) PickedNoOfTimes, ItemName -- I have removed table to get ItemName to simplify this query
FROM tTrayDetails AS TD1
WHERE TD1.SensorValue = 0
AND TD1.CaptureTime > DATEADD(HOUR, [email protected], GETDATE())
AND TD1.SensorValue <> (
SELECT TOP 1 SensorValue
FROM tTrayDetails TD2
WHERE TD2.CaptureTime < TD1.CaptureTime
ORDER BY TD2.CaptureTime DESC
)
GROUP BY TD1.DeviceId
ORDER BY CASE WHEN @MinMax = 'Max' THEN COUNT(TD1.DeviceId) END DESC
, CASE WHEN @MinMax = 'Min' THEN COUNT(TD1.DeviceId) END ASC
Этот запрос работает для всех трех требований, путем просто устанавливать различные значения @HoursBack, @MinMax и @TopRows.
Здесь значения установить для моих трех требований:
- @HoursBack = 24, @ MinMax = 'Макс', @ TopRows = 1
- @HoursBack = 24, @ MinMax = 'Min', @ TopRows = 1
- @HoursBack = 24, @ MinMax = 'Макс', @ TopRows = 10
Теперь Проблема: Этот запрос занимает около 40 сек для выполнения, только для 14K записей в тестовой среде.
В производственной среде ежедневные записи 2-4K будут добавлены, поэтому время выполнения этого запроса будет увеличиваться.
Как я могу изменить запрос, чтобы быстрее работать с большим объемом данных.
Посмотрите на функцию 'LAG() OVER()', с помощью этой функции вы можете выбрать предыдущее значение и определить, является ли данная строка изменением или нет. – Aquillo
Не должны ли данные вашего образца включать время? – SqlZim
Что такое выпуск SQL Server? 2012 поддерживает LAG/LEAD. – dnoeth