You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用SQL按行比较值并筛选含指定多组键值对的order_id?

筛选同时包含指定多组键值对的order_id解决方案

嘿,这个需求其实是SQL里很常见的「多条件组合匹配」场景,我给你整理了几种实用的写法,你可以根据自己使用的数据库类型来选:

方法一:分组聚合筛选(推荐通用写法)

这种方法逻辑清晰,几乎所有主流数据库都支持,核心思路是先过滤出目标键值对的行,再按订单分组统计匹配的唯一组数,只有当组数等于我们需要的3组时,才保留该订单。

SELECT order_id
FROM your_table_name  -- 这里替换成你的实际表名
WHERE (poi, povi) IN (('A', 'a'), ('B', 'b'), ('C', 'c'))
GROUP BY order_id
HAVING COUNT(DISTINCT poi, povi) = 3;

小提示:COUNT(DISTINCT poi, povi)是为了避免同一订单里重复出现某一组键值对(比如同一个订单有两行{A,a})导致计数虚高,确保每组只算一次。

方法二:自连接匹配(兼容老版本数据库)

如果你的数据库不支持(poi, povi)这种行值语法(比如某些老版本的MySQL),可以用三次自连接的方式,分别匹配每组键值对,再取共同的订单ID:

SELECT DISTINCT t1.order_id
FROM your_table_name t1
JOIN your_table_name t2 ON t1.order_id = t2.order_id
JOIN your_table_name t3 ON t1.order_id = t3.order_id
WHERE t1.poi = 'A' AND t1.povi = 'a'
  AND t2.poi = 'B' AND t2.povi = 'b'
  AND t3.poi = 'C' AND t3.povi = 'c';

说明:DISTINCT用来确保最终结果里没有重复的order_id,虽然正常情况下不会出现,但加上更稳妥。

方法三:窗口函数写法(灵活扩展场景)

如果后续需要增加更多匹配组,或者需要保留更多订单相关信息,窗口函数的写法会更灵活:

WITH matched_orders AS (
    SELECT 
        order_id,
        COUNT(DISTINCT CASE 
            WHEN (poi, povi) IN (('A','a'),('B','b'),('C','c')) 
            THEN CONCAT(poi, '_', povi) 
        END) OVER (PARTITION BY order_id) AS match_count
    FROM your_table_name
)
SELECT DISTINCT order_id
FROM matched_orders
WHERE match_count = 3;

解释:用CASE标记符合条件的键值对,通过窗口函数按订单分组统计匹配的唯一组数,最后筛选出组数为3的订单。这种写法在需要扩展匹配组时,只需要修改CASE里的条件和match_count的数值即可。

内容的提问来源于stack exchange,提问作者Praful Sharma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:35:56