T SQL每天仅选择第一条记录

efu*_*ddy 2 sql t-sql sql-server datetime

我创建了一个视图,其中包含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
Run Code Online (Sandbox Code Playgroud)

我只需要每天从每个表中选择第一读物。我找到了一些示例代码,并尝试将其合并,但是它不起作用。

错误的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
Run Code Online (Sandbox Code Playgroud)

当我只查询数据范围时,这就是我得到的输出,其中包括每个表的所有样本:

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
Run Code Online (Sandbox Code Playgroud)

您能告诉我每天如何从每张桌子上抽取第一个样品吗?

Mic*_*zyn 5

试试这个查询。它使用子查询with 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;
Run Code Online (Sandbox Code Playgroud)


Tim*_*sen 5

我们可以尝试对计算列使用 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);
Run Code Online (Sandbox Code Playgroud)

请注意,这里的分区是按tag(即每个表)按每条记录的日期进行的。因此,我们使用CONVERT来获取每个时间戳的日期。我们通过使用出现在子句中的TOP 1 WITH TIES技巧来完全避免子查询。ROW_NUMBERORDER BY