SQL获取每种类型的最新日期时间行

SQL获取每种类型的最新日期时间行,sql,sql-server,greatest-n-per-group,Sql,Sql Server,Greatest N Per Group,我需要一个非常类似SQL查询的帮助。 但是,我需要最新的日期和该日期时间戳的值。使用时 SELECT (SELECT TOP(1) NumericValue FROM Datum WHERE ChannelId = test.ChannelId ORDER BY [DateTime] DESC) AS NumericValue, (SELECT TOP(1) [DateTime] FROM Datum WHERE C

我需要一个非常类似SQL查询的帮助。
但是,我需要最新的日期和该日期时间戳的值。使用时

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 TOP(1)
    test.ChannelId, test.Diag, test.ChannelDescription, test.[DateTime], sub.MaxNumericValueForDateTime
FROM
    Channel test
    CROSS APPLY 
    (
    SELECT MAX(NumericValue) AS MaxNumericValueForDateTime 
    FROM Channel 
    WHERE InstrumentID = 3 AND [DateTime]=test.DateTime
    ) sub
WHERE
    InstrumentID = 3
ORDER BY
    [DateTime] DESC;

如果您只需要Max[DateTime]及其对应的数值,请尝试此操作

SELECT TOP(1)
    test.ChannelId, test.Diag, test.ChannelDescription, test.[DateTime], sub.MaxNumericValueForDateTime
FROM
    Channel test
    CROSS APPLY 
    (
    SELECT MAX(NumericValue) AS MaxNumericValueForDateTime 
    FROM Channel 
    WHERE InstrumentID = 3 AND [DateTime]=test.DateTime
    ) sub
WHERE
    InstrumentID = 3
ORDER BY
    [DateTime] DESC;
试试这个

SELECT DISTINCT a.ChannelId, a.Diag, a.ChannelDescription, a.NumericValue, a.DateTime
FROM Channel a
    INNER JOIN (SELECT ChannelId, MAX(DateTime) Max_DateTime 
            FROM Channel
            GROUP BY ChannelId) b ON a.ChannelId = b.ChannelId AND a.DateTime = b.Max_DateTime
WHERE a.InstrumentID = 3
试试这个

SELECT DISTINCT a.ChannelId, a.Diag, a.ChannelDescription, a.NumericValue, a.DateTime
FROM Channel a
    INNER JOIN (SELECT ChannelId, MAX(DateTime) Max_DateTime 
            FROM Channel
            GROUP BY ChannelId) b ON a.ChannelId = b.ChannelId AND a.DateTime = b.Max_DateTime
WHERE a.InstrumentID = 3

我认为您可以使用如下查询:

;WITH t AS (
    SELECT *
        , ROW_NUMBER() OVER (ORDER BY [DateTime] DESC) rn
    FROM Datum
)
SELECT 
    t.NumericValue, t.[DateTime]
FROM 
    Channel AS test CROSS JOIN t
WHERE
    t.rn = 1 AND
    test.InstrumentId = 3;

我认为您可以使用如下查询:

;WITH t AS (
    SELECT *
        , ROW_NUMBER() OVER (ORDER BY [DateTime] DESC) rn
    FROM Datum
)
SELECT 
    t.NumericValue, t.[DateTime]
FROM 
    Channel AS test CROSS JOIN t
WHERE
    t.rn = 1 AND
    test.InstrumentId = 3;

您的顺序是降序的,因此如果希望从当前输出中获得最后一行,则应按升序进行排序。将DESC替换为ASC您的顺序是降序的,因此如果您想要当前输出的最后一行,则应按升序进行排序。将DESC替换为ASC