【问题标题】:SQL Optimization - Match Analysis sorting matched pairsSQL 优化 - 匹配分析排序匹配对
【发布时间】:2021-11-30 11:09:04
【问题描述】:

场景: 匹配算法已识别 ID1 AND ID2 已匹配。我需要对匹配做进一步分析。为此,我需要减少输出中的行数并正确排序。

这个输入只是样本和子集。拥有数千条实际记录使这项任务变得困难。

输入:

ID1 NAME1 ID2 NAME2
222 SIM 333 SIM
111 SAM 222 SIM
111 SAM 333 SIM
111 SAM 444 SOM
111 SAM 555 SAM
222 SIM 444 SOM
222 SIM 555 SAM
333 SIM 444 SOM
444 SOM 555 SAM
013 AAA 014 BBB
021 SUB 111 SAM
010 CCC 011 DDD
023 SOB 333 SIM

预期输出:

ID NAME
111 SAM
222 SIM
333 SIM
444 SOM
555 SAM
021 SUB
023 SOB
013 AAA
014 BBB
010 CCC
011 DDD

我需要确保输出应该有 ID 应该有不同的 ID1 和 ID2 组合的记录,这仍然很好,因为我可以做不同的和联合。

棘手的部分是确保输出中的数据排序。我需要按顺序保留相似的行。

示例

111,222,333,444,555,021,023 在 ID1 和 ID2 中具有相似的匹配 ID,必须一起排序。在这个组中,排序顺序无关紧要,他们需要在一起。类似地,可能有很多这样的群体。

其余的只要只有一对,只需将它们排序在一起,如 013,014 和 010,011 等

谁能帮我解决这个问题?

【问题讨论】:

  • 请不要标记冲突的 RDBMS。只需标记您真正正在使用的那个。
  • 除非我遗漏了什么...SELECT t.ID1 AS ID, t.NAME1 AS Name FROM TheTable t UNION ALL SELECT t.ID2 AS ID, t.NAME2 AS Name FROM TheTable t
  • 实际上提到的问题在于排序。希望 id1 和 id2 中具有匹配 id 的数据放在一起。 A-M,E-F,M-C 应该 A,M,C 一起排序,因为 M 已经匹配并且 E,F 一起排序
  • 看起来你想要一个graph components algorithm

标签: sql


【解决方案1】:

对于知道模式先验的情况, union + order by case when 会去这里:

select * from (
select ID1, NAME1 from tab1 union
select ID2, NAME2 from tab1 ) a
order by case when NAME1 like '%S' then '' else NAME1 end;

SQL Fiddle 处理您的数据 here


要仅基于 ID1 和 ID2 进行分组,添加了一个排序列, 在MySQL 上将每行的ID 与leastgreatest 连接起来:

select * from (
  select concat(least(ID1, ID2), greatest(ID1,ID2)) sorter, ID1, NAME1 from tab1 union
  select concat(least(ID1, ID2), greatest(ID1,ID2)) sorter, ID2, NAME2 from tab1 ) a
 group by ID1
 order by sorter

或在SQL Server 上使用case when

select min(sorter) sorter, ID1, NAME1 from (
  select concat(case when ID1<ID2 then ID1 else ID2 end, case when ID1>ID2 then ID1 else ID2 end) sorter, ID1, NAME1 from tab1 union
  select concat(case when ID1<ID2 then ID1 else ID2 end, case when ID1>ID2 then ID1 else ID2 end) sorter, ID2, NAME2 from tab1 ) a
 group by ID1, Name1
 order by min(sorter)

【讨论】:

  • 谢谢,但数据只是样本,不一定有'S'。用ID的ID1&ID2数据应该排序
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-14
  • 1970-01-01
  • 2010-09-28
  • 1970-01-01
  • 1970-01-01
  • 2019-05-17
  • 1970-01-01
相关资源
最近更新 更多