sql - 使用 group by 子句中的多行作为单个记录
问题描述
我试图在一行中加入多个列,但没有得到所需的输出。STUFF 中的查询返回所有数据,但我只想要与外部条件匹配的数据。任何帮助,将不胜感激
这是一个小提琴
SELECT
COUNT (*) AS COUNT,
A.AlarmType,
A.DeviceNumber,
Latlong = STUFF (
(
SELECT
',' + CONVERT (VARCHAR, B.Latitude)
FROM
TableAlarmPacket B
WHERE
B.DeviceNumber = A.DeviceNumber AND B.AlarmType = A.AlarmType
FOR XML PATH('')), 1, LEN(','), '')
FROM
TableAlarmPacket AS A
WHERE
A.DeviceNumber IN ('213WP2017006316')
AND A.AlarmType IN (4)
AND (
A.GPSDateTime BETWEEN '2018-09-01 14:00:00'
AND '2018-09-03 13:59:59'
)
GROUP BY
A.DeviceNumber,
A.AlarmType,
dateadd(
MINUTE,
datediff(MINUTE, 0, A.GPSDateTime) / 10 * 10,
0
)
ORDER BY
MAX(A.Id) DESC
这就是我得到的。
6 4 213WP2017006316 -38.0348,-38.0353,-38.019,-37.9938,-37.9756,-37.9869,-38.0015
3 4 213WP2017006316 -38.0348,-38.0353,-38.019,-37.9938,-37.9756,-37.9869,-38.0015
2 4 213WP2017006316 -38.0348,-38.0353,-38.019,-37.9938,-37.9756,-37.9869,-38.0015
2 4 213WP2017006316 -38.0348,-38.0353,-38.019,-37.9938,-37.9756,-37.9869,-38.0015
2 4 213WP2017006316 -38.0348,-38.0353,-38.019,-37.9938,-37.9756,-37.9869,-38.0015
3 4 213WP2017006316 -38.0348,-38.0353,-38.019,-37.9938,-37.9756,-37.9869,-38.0015
预期输出是
6 4 213WP2017006316 -37.6735,-37.6855,-37.6907,-37.6973,-37.7275,-37.7315
3 4 213WP2017006316 -37.6782,-37.6776,-37.6712
2 4 213WP2017006316 -37.7074,-37.7068
2 4 213WP2017006316 -37.76,-37.7356
2 4 213WP2017006316 -37.8276,-37.8279
3 4 213WP2017006316 -37.9271,-37.893,-37.8856
第一个字段是计数的。我的计数和 Latlong 字段没有反映相同的数据。
解决方案
您需要GPSDateTime
在STUFF
查询中添加条件,如下所示:
SELECT
COUNT (*) AS COUNT,
A.AlarmType,
A.DeviceNumber,
Latlong = STUFF (
(
SELECT
',' + CONVERT (VARCHAR, B.Latitude)
FROM
TableAlarmPacket B
WHERE
B.DeviceNumber = A.DeviceNumber AND B.AlarmType = A.AlarmType
and dateadd(
MINUTE,
datediff(MINUTE, 0, A.GPSDateTime) / 10 * 10,
0
) = dateadd(
MINUTE,
datediff(MINUTE, 0, B.GPSDateTime) / 10 * 10,
0
)
FOR XML PATH('')), 1, LEN(','), '')
FROM
TableAlarmPacket AS A
WHERE
A.DeviceNumber IN ('213WP2017006316')
AND A.AlarmType IN (4)
AND (
A.GPSDateTime BETWEEN '2018-09-01 14:00:00'
AND '2018-09-03 13:59:59'
)
GROUP BY
A.DeviceNumber,
A.AlarmType,
dateadd(
MINUTE,
datediff(MINUTE, 0, A.GPSDateTime) / 10 * 10,
0
)
ORDER BY
MAX(A.Id) DESC
推荐阅读
- amazon-web-services - K8S EKS 1.21 手动触发 Cronjob
- flutter - 我在使用 Flutter 时遇到了多个异常:Geolocator 包,MissingPluginException
- amazon-web-services - 我有一个 IAM 用户名、密码帐户 ID。如何在 AWS CLI 或 BOTO3 中设置这些凭证并从 S3 存储桶下载文件夹
- javascript - 在反应中,当用户单击提交按钮时,如何保证通过 useState 挂钩存储的值是最新数据?
- javascript - Nextjs API 函数未呈现所有 API 结果
- python - 从 Pixel Monitor 抓取数据
- reactjs - 加载反应传单地图时无法读取 null 的属性(读取“offsetWidth”)
- javascript - 使用 Alpine JS Persist Plugin 在刷新/重新访问页面后记住活动的切换/选项卡
- revit-api - 行太短 - Revit API 中的错误,但在 Revit UI 上手动工作
- python - 在列内添加逗号分隔值