在sqlserver中如何从每个组获取lastvalue(time)

时间:2019-01-22 07:59:03

标签: sql sql-server

在sql server中,我具有以下表结构

basicid alertType   alertTypeId alertDescription    macId     timeStamp     companyId     alertName           alertCondition    unitType      channelType      alertValue    expectedValue
1234    406          123         test               13446   1547722123000    1234         test data              test          Centimeters       length           50              60
1295    409          127         test               13448   1547722123000    1234         test data              test          Centimeters       length           50.2            60.3
1298    409          128         test               13448   1547722123000    1234         test data              test          Centimeters       length           50.2            60.3
1237    408          123         test               13446   1547722123000    1234         test data              test          Centimeters       length           50.2            60.3
1255    409          128         test               13448   1548135899000    1234         test data              test          Centimeters       length           50.2            60.3
1256    409          128         test               13448   1548135899000    1234         test data              test          Centimeters       length           50.2            60.3

我正在尝试将具有最大时间戳的alertType,alertTypeId,macid分组(如果时间戳也相同,则每组应该仅返回一个数据)。

我正在使用以下查询

SELECT  a.basicid, 
        a.[alertType], 
        a.[alertTypeId], 
        a.[macId],  
        MAX(a.timeStamp) as t  
FROM [test].[dbo].[alertdetails] as a 
GROUP BY a.[alertType], a.[alertTypeId], a.[macId], a.basicid 
ORDER BY a.basicid

但是正在返回所有数据。

我想要的最终数据是

basicid alertType   alertTypeId alertDescription    macId     timeStamp     companyId     alertName           alertCondition    unitType      channelType      alertValue    expectedValue
1234    406          123         test               13446   1547722123000    1234         test data              test          Centimeters       length           50              60
1295    409          127         test               13448   1547722123000    1234         test data              test          Centimeters       length           50.2            60.3
1237    408          123         test               13446   1547722123000    1234         test data              test          Centimeters       length           50.2            60.3
1256    409          128         test               13448   1548135899000    1234         test data              test          Centimeters       length           50.2            60.3

3 个答案:

答案 0 :(得分:3)

您可以使用ROW_NUMBER()轻松执行此操作,就像以下查询一样。

SELECT * 
FROM   (SELECT *, 
               Row_number() 
                 OVER( 
                   partition BY alerttype, alerttypeid, macid 
                   ORDER BY timestamp DESC) RN 
        FROM   [test].[dbo].[alertdetails]) T 
WHERE  rn = 1 

答案 1 :(得分:0)

GROUP BY语句通常与聚合函数(COUNT,MAX,MIN,SUM,AVG)一起使用,以将结果集按一列或多列分组。

我可以看到您尝试按BASICID分组。没有任何重复的值或任何东西。如果要获得您提到的结果,则需要删除该列并使用它。但是您仍然需要..使用此查询

<!-- Bootstrap -->
<link href="/Content/bootstrap.min.css" rel="stylesheet">
<script src="/Scripts/jquery-2.1.1.min.js"></script>
<script src="/Scripts/bootstrap.min.js"></script>

希望这项工作。 PS。我没有运行查询,因此您可能需要进行一些更改。

答案 2 :(得分:0)

此处可以使用窗口功能(例如行号)从分区组中获取您感兴趣的行。

在这种情况下,您可以使用alertType和alertTypeId对窗口进行分区,并按timeStamp(在这种情况下为DESC)对已排序的窗口进行排序。行号将在数据集中创建一个新的物理列,其值例如为1,2,3 ...,以其在分区存储桶中找到的项目数为基础。

现在剩下的就是获取所有值为1的行号。