Sql 在“用顶部选择”中选择
我有两张桌子。表1为渠道,表2为基准。基准是多对一对多通道。我想在循环通过每个通道时,从基准表中获取最新的值和日期时间 我有一个SELECT语句正在运行,但我认为这不是正确的方法Sql 在“用顶部选择”中选择,sql,sql-server,Sql,Sql Server,我有两张桌子。表1为渠道,表2为基准。基准是多对一对多通道。我想在循环通过每个通道时,从基准表中获取最新的值和日期时间 我有一个SELECT语句正在运行,但我认为这不是正确的方法 SELECT (SELECT TOP(1) NumericValue FROM Datum WHERE ChannelId = test.ChannelId ORDER BY [DateTime] DESC) AS NumericValue, (SELECT TO
SELECT
(SELECT TOP(1) NumericValue
FROM Datum
WHERE ChannelId = test.ChannelId
ORDER BY [DateTime] DESC) AS NumericValue,
(SELECT TOP(1) [DateTime]
FROM Datum
WHERE ChannelId = test.ChannelId
ORDER BY [DateTime] DESC) AS DataTime,
ChannelId, Diag, ChannelDescription
FROM
Channel as test
WHERE
InstrumentID = 3
我试过了
SELECT
(SELECT Top(1) NumericValue, [DateTime]
FROM Datum
WHERE ChannelId = test.ChannelId
ORDER BY [DateTime] DESC),
ChannelId, Diag, ChannelDescription
FROM
Channel as test
WHERE
InstrumentID = 3
它怎么会出错呢
当子查询未引入EXISTS时,只能在选择列表中指定一个表达式
使用
MAX
内置函数获取频道的最新值和时间:
SELECT
Value, _DateTime, ChannelId
FROM
Channel [test]
JOIN
(SELECT MAX(NumericValue) Value, MAX(DateTime) _DateTime , ChannelId
FROM Datum
GROUP BY ChannelId) A ON A.ChannelId = test.ChannelId
WHERE
InstrumentID = 3
一个选项是使用
ROW\u NUMBER()
窗口功能,并保留每个通道记录组的第一条记录,每组按日期降序排列
;WITH CTE AS
(
SELECT *,
ROW_NUMBER() OVER (PARTITION BY c.ChannelId ORDER BY d.DateTime DESC) AS rn
FROM Datum d
INNER JOIN Channel c
ON d.ChannelId = c.ChannelId
WHERE c.InstrumentID = 3
)
SELECT *
FROM CTE
WHERE rn = 1
我必须添加一个.ChannelId