sql - 执行非常复杂的 SQL 分组的有效方法 :

标签 sql

假设您有一个像这样的表:

ID | Type | Reference #1 | Reference #2
0  | 1    | [A]          | {a}
1  | 2    | [B]          | {b}
2  | 2    | [B]          | {c}
3  | 1    | [C]          | {d}
4  | 1    | [D]          | {d}
5  | 1    | [E]          | {d}
6  | 1    | [C]          | {e}

有没有什么好的方法可以按“引用#1”和“引用#2”进行分组作为“后备”,因为缺乏更好的表达方式...

例如,我想将以下 ID 分组在一起:

{0} [Unique Reference #1], 
{1,2} [Same Reference #1],
{3,4,5,6} [{3,4,5} have same Reference #2 and {3,6} have same Reference #1]

我完全不知道如何做到这一点......有什么想法吗?

最佳答案

在 Mellamokb 的查询中,分组取决于输入的顺序。

即。

VALUES
    (0, 1, '[A]', '{a}'),
    (1, 2, '[B]', '{b}'),
    (2, 2, '[B]', '{c}'),
    (3, 1, '[C]', '{d}'), // group 3
    (4, 1, '[D]', '{d}'), // group 3
    (5, 1, '[E]', '{d}'), // group 3
    (6, 1, '[C]', '{e}'); // group 3

产生不同的结果

VALUES
    (0, 1, '[A]', '{a}'),
    (1, 2, '[B]', '{b}'),
    (2, 2, '[B]', '{c}'),
    (3, 1, '[C]', '{e}'), //group 3
    (4, 1, '[D]', '{d}'), // group 4
    (5, 1, '[E]', '{d}'), // group 4
    (6, 1, '[C]', '{d}'); // group 3

如果您可以指定的引用有某种自然顺序,则这可能是有意的,但如果不是的话,则会出现问题。 “解决”这个问题或指定另一个问题的方法是,所有相等的 Reference1 创建一组元素,其成员是它们自己,以及 Reference2 等于至少一个的元素强>该集合的成员。

在 SQL 中:

with groupings as (
  select
    ID,Reference1,Reference2,
    (select min(ID) from Table1 t2
     where t2.Reference1=t1.Reference1 or t2.Reference2=t1.Reference2 ) as minID
  from
    Table1 t1
)
select
    t1.ID,t1.Reference1,t1.Reference2,t1.minid as round1,
    (select min(t2.minid) from
            groupings t2
      INNER JOIN groupings t3 ON t1.Reference2=t2.Reference2
) as minID
  from
    groupings t1

这应该每次都会产生完整的分组。

关于sql - 执行非常复杂的 SQL 分组的有效方法 :,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10390828/

相关文章:

SQL 查询 – 执行循环但使用变量数组

c# - Entity Framework 连接字符串问题

sql - 汇总同一张SQL表上的两个条件

sql - 为什么这不能删除重复项

sql - 'AS'在SQL中是什么意思?

MySql 超大文件导入

sql - 按条件 Access 跨行分组

php - 如何根据下拉菜单值显示特定行的数据?

sql - 连接两个表时如何删除一个连接键

mysql - 使用具有多个结果的子查询,这些结果取决于主查询