[英]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.