我有以下代码,运行几次之后意识到它会返回交替的结果,我不明白为什么:
DECLARE @M_ID CHAR(8) = '12345678';
DECLARE @C_ID TINYINT = 1;
DECLARE @StartDate CHAR(14) = '20160726000000';
DECLARE @EndDate CHAR(14) = '20160825235959';
DECLARE @ActivePresent FLOAT;
DECLARE @ActivePresent_DT CHAR(14);
SELECT
@ActivePresent = MAX(ActivePowerPresent),
@ActivePresent_DT = [DateTime]
FROM
EnergyDemand
WHERE
M_ID = @M_ID
AND C_ID = @C_ID
AND ([DateTime] BETWEEN @StartDate AND @EndDate)
GROUP BY
[DateTime]
SELECT @ActivePresent, @ActivePresent_DT
结果在两个值之间交替...
0.00 (20160824195408) and 210.04 (20160815085655)
我想做什么:
根据M_ID = @M_ID
,C_ID = @C_ID
以及给定日期范围
*注意:我将datetime值存储为char(14),因为它们必须在索引中...
也许我的标题是错的,因为它始终是“不一致的”,嗯......
即使是另一种检索我需要的数据的方法也会非常感激。但是解释为什么,对于胜利...我会认为WHERE
子句在GROUP BY
之前运行,因为它是执行的顺序,因此它使用完全相同的结果集?
提前致谢!
答案 0 :(得分:4)
您只需将TOP 1
与ORDER BY
子句一起使用:
SELECT TOP 1 @ActivePresent = ActivePowerPresent, @ActivePresent_DT = [DateTime]
FROM EnergyDemand
WHERE M_ID = @M_ID AND C_ID = @C_ID AND
([DateTime] BETWEEN @StartDate AND @EndDate)
ORDER BY ActivePowerPresent DESC
注意:您应该以原始格式存储datetime
值,而不是CHAR(14)
。 SQL Server可以索引datetime
字段,就像我知道的任何其他RDBMS一样。
答案 1 :(得分:3)
看起来你的group by语句返回多个记录,并且你将它分配给一个变量。请在声明中使用order by来保持一致的行为。
SELECT
@ActivePresent = MAX(ActivePowerPresent),
@ActivePresent_DT = [DateTime]
FROM
EnergyDemand
WHERE
M_ID = @M_ID
AND C_ID = @C_ID
AND ([DateTime] BETWEEN @StartDate AND @EndDate)
GROUP BY
[DateTime]
ORDER BY
[DateTime]
答案 2 :(得分:2)
您只需要读取最后一个值,而
没有订单