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)
您能告诉我每天如何从每张桌子上抽取第一个样品吗?
试试这个查询。它使用子查询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)
我们可以尝试对计算列使用 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