Sql 在“用顶部选择”中选择

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

我有两张桌子。表1为渠道,表2为基准。基准是多对一对多通道。我想在循环通过每个通道时,从基准表中获取最新的值和日期时间

我有一个SELECT语句正在运行,但我认为这不是正确的方法

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