简体   繁体   English

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

[英]T SQL Select only first record for each day

I have created a view which includes specific tables from a SQL database and I can select all the samples from all the tables from a date range sucessfully. 我创建了一个包含SQL数据库中特定表的视图,我可以成功地从日期范围中选择所有表中的所有样本。 Here is a portion of the view design: 以下是视图设计的一部分:

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

I need to select only the first reading each day from each table. 我需要从每张桌子中每天只选择一读。 I found some sample code and tried to incorporate it, but it doesn't work. 我找到了一些示例代码并尝试将其合并,但它不起作用。

Bad T-SQL code: 糟糕的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

When I just run a query for a data range this is the kind of output I get which includes all samples for every table: 当我只是对数据范围运行查询时,这是我得到的输出类型,包括每个表的所有样本:

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

Can you tell me how to pull just the first sample each day from each table? 你能告诉我如何从每张桌子每天拉出第一个样品吗?

Try this query. 试试这个查询。 It uses subquery with ROW_NUMBER to determine first record per table ordered by timestamp: 它使用带有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;

We can try using a CTE with your computed column to keep track of the table source: 我们可以尝试使用计算列的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);

Note carefully that the partition here is by tag (ie per table) and by the date of each record. 请注意,此处的分区是按tag (即每个表) 每个记录的日期 Hence, we use CONVERT to obtain the date of each timestamp. 因此,我们使用CONVERT来获取每个时间戳的日期。 We avoid a subquery altogether by using a TOP 1 WITH TIES trick where ROW_NUMBER appears in the ORDER BY clause. 我们通过使用TOP 1 WITH TIES技巧完全避免使用子查询,其中ROW_NUMBER出现在ORDER BY子句中。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM