[英]select unique GROUP_CONCAT-ed rows based on different column
给定的表可以有以下行。
即对于给定的filename
,可以有两个唯一的version_id
(s)。
file_id version_id filename
1 OS_v1 abc.update
1 App_v1 abc.update
2 OS_v2 xyz.update
2 App_v2 xyz.update
3 OS_v1 abc(1).update
3 App_v1 abc(1).update
PRIMARY KEY (`version_id`, `filename`)
如何检测没有两个不同的文件名具有相同的 OS_App(版本)组合?
在给定的示例中,使用file_id=3
行集是file_id=1
的副本。
注意:为 OS 和 App 版本定义单独的列很容易,但这需要我们不想经历的大量代码更改。
问题:是否有一个SELECT
查询只返回file_id = 1
和file_id = 2
并省略file_id = 3
?
到目前为止,我已经提出了这个查询,它选择了按filename
分组的version_id
组合,但第 2 行是第 1 行的重复
SELECT DISTINCT(GROUP_CONCAT(version_id SEPARATOR '-')) ,
filename
FROM schema_name.table_name
GROUP BY filename;
回报:
concat_version patch_filename
OS_V1-APP_V1 xyz.update
OS_V2-APP_V2 abc(1).update
OS_V1-APP_V1 abc.update
问题:是否有一个 SELECT 查询只返回 file_id = 1 和 file_id = 2 并省略 file_id = 3
如果您使用的是 MySQL 8.0,则可以利用窗口函数ROW_NUMBER()
:
SELECT x.file_id, x.version_id, x.filename
FROM (
SELECT t.*, ROW_NUMBER() OVER(PARTITION BY version_id ORDER BY file_id) rn
FROM master_logs.system_patches t
) x
WHERE x.rn = 1
内部查询为version_id
组中的每条记录分配一个行号,按file_id
排序,外部查询过滤行号为1
记录。
对于早期版本的 MySQL,一种典型的解决方案是使用带有NOT EXISTS
条件的相关子查询来过滤掉不需要的记录:
SELECT t.file_id, t.version_id, t.filename
FROM master_logs.system_patches t
WHERE NOT EXISTS (
SELECT 1
FROM master_logs.system_patches t1
WHERE t1.version_id = t.version_id AND t1.file_id < t.file_id
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.