我有一个包含列通道,值和时间戳的表,另一个表包含7个其他具有各种数据的列。
我将这两个加在一起,我想在一小时内选择值列的最大值,以及相应行的时间戳。这是我尝试过的,但它(显然)不起作用。
SELECT
v.channel,
MAX(v.value),
v.timestamp,
i.stuff,
...
FROM
Values v
INNER JOIN
@Information i
ON i.type = v.type
GROUP BY channel, DATEPART(HOUR, timestamp), i.stuff, ...
我(并不奇怪)得到以下错误:
“dbo.Values.timestamp”在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中
我该如何正确地做到这一点?
答案 0 :(得分:3)
您可以使用RANK()或DENSE_RANK()功能来获取适当的结果。类似的东西:
;WITH RankedResults AS
(
SELECT
channel,
value,
timestamp,
type,
RANK() OVER (PARTITION BY DATEPART(hour,timestamp) ORDER BY value desc) as Position
FROM
Values
)
SELECT
v.channel,
v.value,
v.timestamp,
i.stuff
/* other columns */
FROM
RankedResults v
inner join
@Information i
on
v.type = i.type
WHERE
v.Position = 1
(是否使用RANK或DENSE_RANK取决于你想要在关系的情况下做什么,真的)
(编辑SQL以包含联接,以响应Tomas的评论)
答案 1 :(得分:0)
您必须在Group By子句中包含'v.timestamp'。 希望这对你有所帮助。