SQL获取每种类型的最新日期时间行
我需要一个非常类似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
但是,我需要最新的日期和该日期时间戳的值。使用时
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