SQL GroupBy返回不一致(交替)结果

时间:2016-09-12 13:22:51

标签: sql sql-server tsql group-by

我有以下代码,运行几次之后意识到它会返回交替的结果,我不明白为什么:

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_IDC_ID = @C_ID以及给定日期范围

获取表格中的最高值以及相应的日期时间值

*注意:我将datetime值存储为char(14),因为它们必须在索引中...

也许我的标题是错的,因为它始终是“不一致的”,嗯......

即使是另一种检索我需要的数据的方法也会非常感激。但是解释为什么,对于胜利...我会认为WHERE子句在GROUP BY之前运行,因为它是执行的顺序,因此它使用完全相同的结果集?

提前致谢!

3 个答案:

答案 0 :(得分:4)

您只需将TOP 1ORDER 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)

您只需要读取最后一个值,而

没有订单