簡體   English   中英

SQL-按唯一列集分組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM