获取具有多个满足特定条件的重复值的 id 列表

问题描述 投票:0回答:2

我有这样的疑问:

SELECT u.id, u.service, u.subscription_date 
FROM user u

WHERE EXISTS (
    SELECT 1
    FROM user u2
    WHERE u2.subscription_date = u.subscription_date
    AND u2.service = u.service
    GROUP BY u2.service, u2.subscription_date
    HAVING COUNT(*) > 1
);

我的问题是,我不仅仅希望找到具有重复的 subscription_date 和 service 值的用户。我希望查询专门为我提供用户 ID 列表,其中相同的服务和订阅日期出现两次。

澄清一下:

假设我有以下用户:

user_id: 001, 
subscription_date: 2024-01-01
service: basic

user_id: 002, 
subscription_date: 2024-01-01
service: plus

user_id: 002, 
subscription_date: 2023-01-01
service: plus

user_id: 003, 
subscription_date: 2024-01-01
service: premium

user_id: 003, 
subscription_date: 2024-01-01
service: premium

在我希望运行的查询中,它应该只返回用户 id 003,因为虽然用户 id 002 也有服务的副本,但它没有重复的订阅日期。

我不知道如何将此条件转换为查询。

sql mysql
2个回答
0
投票

这听起来很简单

select user_id,
       service,
       subscription_date
from users
group by user_id,service,subscription_date
having count(*) > 1;

另一种方法是使用

COUNT(*) OVER()
窗口函数(需要MySQL 8+)

查询,

select user_id,
       subscription_date,
       service
from (  
       select *,
              count(*) over (partition by user_id,subscription_date,service order by user_id asc ) as cnt 
       from users
     ) sub
where cnt > 1;

结果,

user_id subscription_date   service
    3      2024-01-01       premium
    3      2024-01-01       premium

示例


0
投票

您似乎只需要所有列上都有重复项的记录 - id、subscription_date 和 service,在这种情况下,它只是所有列上的简单分组:

SELECT * 
FROM user
GROUP BY user_id, service, subscription_date
HAVING COUNT(*) > 1

或者如果表 user 中有更多列,请将 * 替换为这 3 列的列表。

https://dbfiddle.uk/pWROWL0T

© www.soinside.com 2019 - 2024. All rights reserved.