mysql - 像这样在 SQL 查询中查找 SQL 表和列表之间的公共(public)值

标签 mysql sql group-by mariadb

这是我的示例数据集...

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 fiddle :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 表之间找到“类似的 blockhash”。

关于比率列:

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

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

关于 pos。我只想知道 匹配 block pos 值。

最佳答案

使用 ROW_NUMBER() 窗口函数,您可以检查“randomstr1”是否存在超过 3 次或“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

关于mysql - 像这样在 SQL 查询中查找 SQL 表和列表之间的公共(public)值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61259608/

相关文章:

Python pandas - 如何对封闭元素进行分组

python - Pandas groupby agg - 如何获得计数?

mysql - 按不存在的值进行分组

php - 插入多个 _POST 值以从 php Web 表单发送到 sql 表

php - 继承和关联场景中的 Dotrine 查询问题

sql - 在 SQL Server 中使用 JOIN 排除记录

sql - 日期时间变量与日期时间变量的字符串表示形式

php - 获取只有子类别有产品的类别的类别计数

MySQL : Analyse Table Data by going to specific row and retrieve column value in the specific row

Mysql "SOURCE <file>"importing of UTF8 dump 给出问号