基于问题“SQL - Turn relationship IDs into a delimited list”,我想根据独特的网站集进一步对结果进行分组。例如,在该问题中使用相同的数据:
站点 15 和 16 一起共享 a、b、c 的一种排列。站点 18、19、20 共享另一个排列。站点 17 使用两种排列。
我想找到一个查询,其结果与链接的问题相似,但 site_ids 没有任何重叠:
我不确定只使用 SQL 是否可行,我可能只需要构建一些东西来处理代码中的数据,但我祈祷...
我正在使用 SQL Server,但如果知道如何使用 postgres 也很好。
更新:
有人建议Simulating group_concat MySQL function in Microsoft SQL Server 2005?可能是重复的。从我对 group_concat 的(有限)理解来看,它似乎可能会重复 question referenced above ,但不是这个问题。这个问题不需要在 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 分解回它们所属的组。
关于SQL - 按唯一列集分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35000080/