在 mariadb 中获取合并数据

Posted

技术标签:

【中文标题】在 mariadb 中获取合并数据【英文标题】:Getting Merged Datas in mariadb 【发布时间】:2021-03-02 12:09:16 【问题描述】:

我正在尝试合并 mariadb 中的数据。 我只想获取结果不佳的数据

首先你应该看看我建立的查询

如果变成好的数据,有3个查询用于比较

当回合为1并且结果为好时,下回合不可能变成坏的。 这种情况下一轮的结果总是好或为空

当轮数为1且结果为坏时,下一轮可以变成好坏和NULL

下一轮,如果结果为null,仍然是不好的结果。

SELECT name,result,round FROM my_table WHERE round = 1
╔══════╦════════╦═══════╗
║ name ║ result ║ round ║
╠══════╬════════╬═══════╣
║  A   ║ bad    ║  1    ║
║  B   ║ bad    ║  1    ║
║  C   ║ bad    ║  1    ║
║  D   ║ good   ║  1    ║
╚══════╩════════╩═══════╝
SELECT name,result,round FROM my_table WHERE round = 2
╔══════╦════════╦═══════╗
║ name ║ result ║ round ║
╠══════╬════════╬═══════╣
║  A   ║ NULL   ║  2    ║
║  B   ║ NULL   ║  2    ║
║  C   ║ good   ║  2    ║
║  D   ║ NULL   ║  2    ║
╚══════╩════════╩═══════╝
SELECT name,result,round FROM my_table WHERE round = 3
╔══════╦════════╦═══════╗
║ name ║ result ║ round ║
╠══════╬════════╬═══════╣
║  A   ║ NULL   ║  3    ║
║  B   ║ good   ║  3    ║
║  C   ║ good   ║  3    ║
║  D   ║ NULL   ║  3    ║
╚══════╩════════╩═══════╝

我想得到这样的结果:

╔══════╦════════╦═══════╗
║ name ║ result ║ round ║
╠══════╬════════╬═══════╣
║  A   ║ bad    ║  3    ║
╚══════╩════════╩═══════╝

我的意思是我可以这样搜索

SELECT name,result,round FROM my_table WHERE type = 3(last round) and result = 'bad'

但你知道它是否为null,我必须找到它的上一轮结果。

然后我要再次请求查询,如果它再次有NULL作为结果,我必须请求上一轮的查询。它会重复。我认为这不是一个好主意。

如果你能理解我需要什么以及我应该怎么做,请告诉我更好的想法或解决方案

【问题讨论】:

为您的表提供 CREATE TABLE 和 INSERT INTO 数据匹配显示的输出。 PS。输出 2 和 3 与查询不匹配(输出列表中的 type 但输出表中的 round)。 @Akina 哦对不起我编辑了它 【参考方案1】:

您希望最近的非 NULL 结果是坏的。您可以使用聚合

select name
from t
group by name
having max(case when result is not null then round end) = max(case when result = 'Bad' then round end)

having 子句正在获取最近一轮的结果。它将最近一轮与“坏”结果进行比较。如果它们相等,则名称为“Bad”。

另一种方法是使用窗口函数:

select t.*
from (select t.*,
             row_number() over (partition by name order by round desc) as seqnum
      from test t
      where result is not null
     ) t
where seqnum = 1 and result = 'Bad';

【讨论】:

【参考方案2】:

看起来像

SELECT name, `bad` result, 3 round
FROM table
GROUP BY name
HAVING SUM(CASE WHEN round = 1 AND result = 'bad' THEN 1 END)
   AND !SUM(CASE WHEN round IN (2,3) AND result = 'good' END)

【讨论】:

以上是关于在 mariadb 中获取合并数据的主要内容,如果未能解决你的问题,请参考以下文章

单机安装mariadb怎么获取密钥

从数据库 Mysql/MariaDB 中获取正确的数据集

如何使用分号分隔符从 MariaDB 获取数据?

(十二)MariaDB中的分区操作

查询 MariaDB 的安装文件夹?

如何从 MySQL/Mariadb 获取用户 ID?