[英]SQL - Group by unique column sets
基于“ SQL-将关系ID转换为定界列表 ”这一问题,我想进一步按照唯一的网站集对结果进行分组。 例如,在该问题中使用相同的数据:
站点15和16共同共享a,b,c的一个排列。 站点18、19、20共享另一个排列。 站点17使用两个排列。
我想查找一个查询,其结果类似于链接的问题,但site_ids中没有任何重叠:
我不确定仅SQL是否有可能,我可能只需要构建一些东西即可处理代码中的数据,但我却不知所措...
我正在使用SQL Server,但是知道如何使用postgres也很高兴。
更新:
有人建议在Microsoft SQL Server 2005中模拟group_concat MySQL函数吗? 可能是重复的。 从我对group_concat的(有限的)理解中,似乎它可以重复上面提到的问题 ,但不能重复这个问题。 这个问题在site_ids中不需要重叠。
我不知道这是否是最有效的方法,但是想起来确实很有趣。 :)
;WITH CTE_unique_groups AS (SELECT DISTINCT a, b, c FROM dbo.My_Table),
CTE_numbered_groups AS (SELECT a, b, c, ROW_NUMBER() OVER(ORDER BY a, b, c) AS row_num FROM CTE_unique_groups),
CTE_exponented_groups AS (SELECT a, b, c, POWER(2, row_num) AS group_value FROM CTE_numbered_groups),
CTE_unique_sets AS (
SELECT
MT.site_id,
SUM(grps.group_value) AS total_group_value
FROM
CTE_exponented_groups AS grps
INNER JOIN dbo.My_Table MT ON MT.a = grps.a AND MT.b = grps.b AND MT.c = grps.c
GROUP BY
MT.site_id
),
CTE_grouped_sites AS
(SELECT total_group_value, STUFF((SELECT ', ' + CAST(site_id AS VARCHAR(10)) FROM CTE_unique_sets t2 WHERE t2.total_group_value = t1.total_group_value FOR XML PATH('')), 1, 2, '') AS site_ids
FROM CTE_unique_sets t1)
SELECT DISTINCT
x.a, x.b, x.c, gs.site_ids
FROM
CTE_grouped_sites gs
INNER JOIN CTE_exponented_groups x ON
gs.total_group_value & x.group_value = x.group_value
要点是,首先您必须确定每个唯一的组集合。 完成此操作后,您可以使用按位&
运算符将站点ID分解回它们所属的组。
如果您对数组没问题(以您用的方式将其本身显示为逗号分隔的字符串),则这是PostgreSQL中的一种可能方法。
with perms as (
select
f.a, f.b, f.c, f.site_id,
count(1) over (partition by f.site_id) as cnt
from
your_table f
)
select
p1.a, p1.b, p1.c,
array (select p2.site_id
from perms p2
where
p1.a = p2.a and
p1.b = p2.b and
p1.c = p2.c and
p1.cnt = p2.cnt)
from perms p1
group by
p1.a, p1.b, p1.c, p1.cnt
结果将如下所示:
bar baz blah {20,18,19}
foo bar baz {17}
foo bar baz {16,15}
bar baz blah {17}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.