计算重复字段连接的结果

Posted

技术标签:

【中文标题】计算重复字段连接的结果【英文标题】:Counting results of join on duplicate field 【发布时间】:2012-10-26 07:21:12 【问题描述】:

我有一个包含重复列值的 table1

表1

id   code
1   201202  0000    1111
2   201202  0000    9999
3   201203  0000    9999
4   201203  0000    0999
5   201204  1000    1999
6   201204  2000    2999
7   201205  3000    3999
8   201205  4000    4999
9   201205  5000    5999

表 2

id   numbers
1   2012020010  
2   2012024929  
3   2012033838
4   2012052434
5   2012052229
6   2012052232

我想计算表 2 中作为表 1 中不同代码子串的所有数字 即结果应该是

code   frequency
201202   2
201203   1
201205   3

我已经能够得到每个代码的所有数字,但不知道如何计算它们

SELECT DISTINCT table1.code , table1.id, table2.number AS ph_npa, count( * )
FROM table1
INNER JOIN table2 ON substr( table2.number, 1, 6 ) = table1.code
GROUP BY table1.number

感谢任何帮助。

【问题讨论】:

【参考方案1】:

我并不是真正使用“内连接”语法的人,我更喜欢在数据上使用看起来更简洁的隐式连接。

select
  count(*)
from
  npanxxsmall n, phone_numbers p
where
  substr(n.code, 1, 6) = substr(p.number, 1, 6);

让我知道这是否有效!

【讨论】:

结果和上面robin的解一样,返回的结果是table1中代码的频率 你是对的,我已经修改它只给出计数而不是频率。【参考方案2】:

好的,我得到它的工作,查询超级快

选择

DISTINCT A.code as code, B.计数AS频率 FROM table1 AS A

内连接(

SELECT substr(number, 1, 6) AS subnumber, count(1) AS Counts 从表 2 GROUP BY substr(数字, 1, 6) ) AS B ON A.code = B.subnumber

即 从表2中选择数量和频率 然后加入不同的代码形式表1

【讨论】:

【参考方案3】:

试试下面的。它可能会对大型数据集产生性能影响,但可以帮助您入门。它正在处理我的测试数据。

SELECT SUBSTR(t2.numbers, 1,6) AS CODE, COUNT(*) AS frequency
FROM table_2 t2
WHERE SUBSTR(t2.numbers, 1,6) IN (SELECT t1.code FROM table_1 t1)
GROUP BY SUBSTR(t2.numbers, 1,6)

让我知道它是否有效!

【讨论】:

【参考方案4】:
SELECT t1.code, COUNT(*) AS frequency
FROM table_one AS t1
LEFT JOIN table_two AS t2
ON t2.numbers LIKE CONCAT(t1.code, '%')
GROUP BY t1.code

使用LEFT JOININNER JOIN 取决于您是否想要带有frequency = 0 的行。我所做的基本上就是使用% 通配符运行LIKE 作为连接条件。

【讨论】:

实际上返回的结果是table1中代码的频率,但我想要的是table1中代码的substr(1,6)数字的频率 更正:table2中代码substr(1,6)的数字频率

以上是关于计算重复字段连接的结果的主要内容,如果未能解决你的问题,请参考以下文章

Oracle - ORA-01489:字符串连接的结果太长 [重复]

oracle查询结果如果某个字段重复的时候就取另一个字段值最小的数据

节点 postgres 并获得具有重复名称的连接字段

多表合并且去掉重复项

请教大家!mysql查询结果,过滤重复数据?

用sql语句进行多表连接查询,怎么不查出重复数据