在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
答案 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的行号。