使用MySQL获取组中属性值最小的行

llmtgqce  于 2023-04-28  发布在  Mysql
关注(0)|答案(4)|浏览(130)

我有一个表(假设prod_config),其中包含以下数据-
| 产品ID|配置ID|配置类型|
| --------------|--------------|--------------|
| 九八五六|1|二|
| 九八五五|九十三|1|
| 九八五五|九十二|二|
| 九八五五|九十一|二|
| 九八五四|九十三|1|
| 九八五四|九十二|二|
| 九八五四|九十一|二|
| 九八四九|九十三|1|
| 九八四九|九十二|二|
| 九八五零|九十一|二|
| 九八五二|八十八|1|
| 九八五二|九十|二|
| 九八五三|一百|二|
这种关系是这样的

*Prod_Id可Map到单个或多个**Config_Id(*Config_Type 1或2

  • 如果ProdId出现一次,则ConfigType将始终为2
  • 如果ProdId多次出现,则只有一行ConfigType1

我需要找到下面的结果有--

  • 所有ProdId只有一次出现
  • 对于所有出现多次的ProdIds,只选择Config_Type为1的行
产品ID配置ID配置类型
九八五六1
九八五五九十三1
九八五四九十三1
九八四九九十三1
九八五零九十一
九八五二八十八1
九八五三一百
pepwfjgg

pepwfjgg1#

你可以使用一个窗口函数来得到你需要的结果-

SELECT Prod_Id, Config_Id, Config_Type
  FROM (SELECT Prod_Id, Config_Id, Config_Type
               COUNT(*) OVER(PARTITION BY Prod_Id) cnt_prod_id
          FROM your_table 
       )
 WHERE cnt_prod_id = 1
    OR (cnt_prod_id > 1 AND Config_Type = 1);
yqhsw0fo

yqhsw0fo2#

小提琴

SELECT t1.Prod_Id, t1.Config_Id, t1.Config_Type
    FROM prod_config t1
    LEFT JOIN (
      SELECT Prod_Id, MIN(Config_Id) AS Config_Id
      FROM prod_config
      WHERE Config_Type = 1 OR NOT EXISTS (
        SELECT * FROM prod_config t2
        WHERE t2.Prod_Id = prod_config.Prod_Id AND t2.Config_Type = 1
      )
      GROUP BY Prod_Id
    ) t2 ON t1.Prod_Id = t2.Prod_Id AND t1.Config_Id = t2.Config_Id
    WHERE t2.Prod_Id IS NOT NULL;

子查询t2为每个Prod_Id选择最小Config_Id,其中Config_Type=1。
如果给定的Prod_Id没有Config_Type=1的行,则子查询选择具有最小Config_Id的行。
外部查询将原始表与Prod_Id和Config_Id上的子查询联接。
连接结果中的Prod_Id为null,这意味着这些不是最终结果的一部分

bzzcjhmw

bzzcjhmw3#

这里有一个相当容易理解的:

select * 
from prod_config
where prod_id in (select prod_id from prod_config
                group by prod_id
                having count(*)=1)
    or 
        (prod_id not in (select prod_id from prod_config
                        group by prod_id
                        having count(*)=1)
            and config_type=1)
;

但进一步考虑,对于给定的多示例prod_id,只能存在一个config_type=1,因此我们可以将其简化为:

select * 
from prod_config p
where prod_id in (select prod_id from prod_config
                group by prod_id
                having count(*)=1)
    or 
         config_type=1
;
gorkyyrv

gorkyyrv4#

您可以使用下面的查询实现您想要的输出

SELECT t1.Prod_Id, t1.Config_Id, t1.Config_Type
FROM prod_config t1
WHERE NOT EXISTS (
    SELECT 1 
    FROM prod_config t2
    WHERE t2.Prod_Id = t1.Prod_Id AND t2.Config_Id > t1.Config_Id);

在此查看演示

相关问题