T SQL Выберите только первую запись для каждого дня - PullRequest
2 голосов
/ 12 марта 2019

Я создал представление, которое включает в себя определенные таблицы из базы данных SQL, и я могу успешно выбрать все образцы из всех таблиц из диапазона дат. Вот часть дизайна представления:

SELECT 'PLANT FLOW1' AS 'Tag', ts AS 'Timestamp', value AS 'Data'
FROM dbo.UASTP_150000_TL63
UNION
SELECT 'PLANT FLOW2' AS 'Tag', ts AS 'Timestamp', value AS 'Data'
FROM dbo.UASTP_150000_TL10
UNION
SELECT 'INFLUENT FLOW' AS 'Tag', ts AS 'Timestamp', value AS 'Data'
FROM dbo.UASTP_150000_TL1
UNION
SELECT 'EFFLUENT FLOW' AS 'Tag', ts AS 'Timestamp', value AS 'Data'
FROM dbo.UASTP_150000_TL2
UNION

Мне нужно выбирать только первое чтение каждый день из каждой таблицы. Я нашел пример кода и попытался включить его, но он не работает.

Неверный код T-SQL:

SELECT TOP (100) percent [Tag]
      ,[Timestamp]
      ,[Data]
  FROM [enteliwebDB].[dbo].[WIMS_View]
  where Timestamp >= DATEADD(day, -30, getdate())
  and Timestamp <= getdate()
  and where Tag in(
    SELECT min(Timestamp)
  )
  order by Tag, Timestamp

Когда я просто запускаю запрос для диапазона данных, я получаю такой вывод, который включает все выборки для каждой таблицы:

Tag Timestamp   Data
9012 TURBIDITY METER TREND  2019-03-10 11:41:14.0680000 5.1552605629
9012 TURBIDITY METER TREND  2019-03-10 11:51:14.0630000 5.14915704727
9012 TURBIDITY METER TREND  2019-03-10 12:01:14.0600000 5.12321662903
9012 TURBIDITY METER TREND  2019-03-10 12:11:14.0560000 5.16212701797
9012 TURBIDITY METER TREND  2019-03-10 12:21:14.0540000 5.12703132629
9012 TURBIDITY METER TREND  2019-03-10 12:31:14.0500000 5.13313484192
9012 TURBIDITY METER TREND  2019-03-10 12:41:14.0470000 5.17814922333
9012 TURBIDITY METER TREND  2019-03-10 12:51:14.0410000 5.14000177383

Можете ли вы сказать мне, как вытащить только первый образец каждый день из каждого стола?

Ответы [ 2 ]

5 голосов
/ 12 марта 2019

Попробуйте этот запрос.Он использует подзапрос с ROW_NUMBER для определения первой записи в таблице, упорядоченной по метке времени:

SELECT [Tag],
       [Timestamp],
       [Data]
FROM (
    SELECT ROW_NUMBER() OVER (ORDER BY ts DESC PARTITION BY Tag) [rn],
           [Tag],
           [Timestamp],
           [Data]
    FROM MyView
) [a] WHERE [rn] = 1;
4 голосов
/ 12 марта 2019

Мы можем попытаться использовать CTE с вашим вычисляемым столбцом для отслеживания источника таблицы:

WITH cte AS (
    SELECT 'PLANT FLOW1' AS tag, ts AS Timestamp, [value] AS data
    FROM dbo.UASTP_150000_TL63
    UNION ALL
    SELECT 'PLANT FLOW2', ts, [value] FROM dbo.UASTP_150000_TL10
    UNION ALL
    SELECT 'INFLUENT FLOW', ts, [value] FROM dbo.UASTP_150000_TL1
    UNION ALL
    SELECT 'EFFLUENT FLOW', ts, [value] FROM dbo.UASTP_150000_TL2
)

SELECT TOP 1 WITH TIES
    tag,
    ts,
    [value]
FROM cte
ORDER BY
    ROW_NUMBER() OVER (PARTITION BY tag, CONVERT(date, ts) ORDER BY ts);

Обратите внимание, что раздел здесь равен tag (то есть для каждой таблицы) и к дате каждой записи.Следовательно, мы используем CONVERT, чтобы получить дату каждой отметки времени.Мы вообще избегаем подзапроса, используя трюк TOP 1 WITH TIES, где ROW_NUMBER появляется в предложении ORDER BY.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...