【问题标题】:Find common values between SQL table & list in SQL Query like this像这样在 SQL 查询中查找 SQL 表和列表之间的共同值
【发布时间】:2020-04-16 20:35:10
【问题描述】:

这是我的样本数据集...

CREATE TABLE blockhashtable (id int PRIMARY KEY AUTO_INCREMENT,pos int,filehash varchar(35), blockhash varchar(130) );

insert into blockhashtable 
(pos,filehash,blockhash) values 
(1, "random_md51", "randstr1"),
(2, "random_md51", "randstr2"),
(3, "random_md51", "randstr3"),
(1, "random_md52", "randstr2"),
(2, "random_md52", "randstr2"),
(3, "random_md52", "randstr2"),
(4, "random_md52", "randstr1"),
(5, "random_md52", "randstr7"),
(1, "random_md53", "randstr2"),
(2, "random_md53", "randstr1"),
(3, "random_md53", "randstr2"),
(4, "random_md53", "randstr1"),
(1, "random_md54", "randstr1"),
(2, "random_md54", "randstr55");

当前 SQL 查询(需要修复):

SELECT filehash
     , GROUP_CONCAT(pos ORDER BY pos) pos
     , (avg(blockhash IN('randstr1','randstr2','randstr3','randstr2','randstr2'))) as ratio
  FROM blockhashtable
 GROUP
    BY filehash

电流输出(需固定)

filehash    pos        ratio
random_md51 1,2,3      1
random_md52 1,2,3,4,5  0.8
random_md53 1,2,3,4    1
random_md54 1,2        0.5

SQL 小提琴:http://sqlfiddle.com/#!9/6b5220/10

预期输出:

filehash    pos        ratio
random_md51 1,2,3      1
random_md52 1,2,3,4    0.8
random_md53 1,2,3      0.75
random_md54 1          0.5

我基本上是想在查询列表和 sql 表之间找到“相似的块哈希”。

关于比率列:

如果randomstr1 在 SQL 查询中只出现一次,那么我希望 SQL 数据库中的 randomstr1 最多匹配 1 个。

在第三个输出行。 ratio 是 0.75,因为 randomstr1 在查询中只出现一次,即使它在 MySQL 表中出现两次。所以在第三行,我们找到了 3/4 匹配。 randomstr2 在第三行中两次匹配,因为它在 SQL 查询中出现了 2 次或更多次。

关于pos。我只想知道matched blockspos 值。

【问题讨论】:

  • 据我所知 1 是正确的,在您的情况下,有 4 行带有 random_md53 和 ('randstr1','randstr2','randstr3') ('randstr1','randstr2')我不明白你想跳过哪一个。
  • 对不起,我编辑了错误的问题....1分钟
  • 你的MySql是什么版本的?
  • 请检查我编辑的SQL查询@nbk有三个randomstr2
  • 我用的是MySQL-Wordbench 8.0,我想还是MySql 8.0...让我再确认一下

标签: mysql sql group-by mariadb


【解决方案1】:

使用ROW_NUMBER() 窗口函数,您可以检查“randomstr1”是否存在超过或“randomstr2”是否存在超过 3 次,因此您可以忽略它们:

with 
  row_numbers as (
    select *, 
      row_number() over (partition by filehash, blockhash order by pos) rn
    from blockhashtable 
  ),
  cte as (
    select *, 
    (blockhash = 'randstr1' and rn = 1)
    or 
    (blockhash = 'randstr2' and rn <= 3)
    or 
    (blockhash = 'randstr3') valid
    from row_numbers
  )
select filehash,
  group_concat(case when valid then pos end order by pos) pos,
  avg(valid) as ratio
from cte
group by filehash

请参阅demo
结果:

> filehash    | pos     |  ratio
> :---------- | :------ | -----:
> random_md51 | 1,2,3   | 1.00
> random_md52 | 1,2,3,4 | 0.80
> random_md53 | 1,2,3   | 0.75
> random_md54 | 1       | 0.50

【讨论】:

  • 这不是我要找的对不起。在我的原始查询randomstr2 中重复 3 次,所以我只想在表中匹配它最多 3 次。
  • 非常感谢。 :)
猜你喜欢
  • 2016-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-27
  • 1970-01-01
  • 1970-01-01
  • 2017-08-30
相关资源
最近更新 更多