SQL - 按唯一列集分组

标签 sql sql-server postgresql

基于问题“SQL - Turn relationship IDs into a delimited list”,我想根据独特的网站集进一步对结果进行分组。例如,在该问题中使用相同的数据:

orig data

站点 15 和 16 一起共享 a、b、c 的一种排列。站点 18、19、20 共享另一个排列。站点 17 使用两种排列。

我想找到一个查询,其结果与链接的问题相似,但 site_ids 没有任何重叠:

enter image description here

我不确定只使用 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/

相关文章:

sql - 无法在表中插入新列

mysql - 如何查询Mysql特定列中相同id具有不同值的位置

sql - 如果相等,如何按列排序,按另一列排序

SQL Server VIEW 结果与 SELECT 不同

c# - 我需要像树结构一样在下拉列表中显示数据,我尝试过但无法在 ASP.Net 中正确显示

sql - 如何优化 Django 生成的这个非常慢的查询?

mysql - 如何在 MySQL v8 中生成固定数量的行来进行性能测试?

sql - 我正在尝试根据日期和符号通过将两个表的两列相乘来更新另一个表中的多个值

postgresql - 如何消除对两个共同使用桥接网络的 docker 容器的需求?

sql - 如何删除json数组元素中的对象?