【问题标题】:Find duplicates on the basis of a condition in sql根据sql中的条件查找重复项
【发布时间】:2021-06-30 03:04:10
【问题描述】:

所以,我想根据条件在表中查找重复的 ID。

我有多个 2019 年、2019 年、2020 年、2021 年的文件 ID。这些年的文件之间的 ID 可能重叠。 我想找到 2019 年存在的所有重复 ID,其余年份也存在。

如果:

id year
1 2019
1 2020
1 2021
2 2019
3 2019
4 2018
4 2019

我想要:

id
1
4

注意:我只想要特定于 2019 年的 ID。如果 2018 年和 2020 年的 ID 存在,那应该是不匹配的。

这是我尝试过的:

select  id from table
intersect
select  id from table where year='2019'

提前致谢!

【问题讨论】:

  • 你的 RDMBS 是什么?

标签: sql


【解决方案1】:

假设您想获取 所有 年份为 2019 年的行,您可以使用非常简单的查询:

SELECT * FROM TABLE WHERE year = '2019'

如果您只想返回今年的 ID 14,您可以使用:

SELECT * FROM TABLE WHERE year = '2019' AND id IN ('1', '4')

如果您想返回有重复的年份,您可以使用GROUP BYHAVING

SELECT id, year, COUNT(*)
FROM TABLE
WHERE year = '2019'
GROUP BY year
HAVING COUNT(*) > 1

请注意,您需要将 TABLE 替换为您的表名。

【讨论】:

  • 我想这并不能回答我的问题。我想查找所有年份文件中存在的 id,以及 2019 年。如果不是 2019 年,而是其他年份,请忽略它。但如果是 2019 年和其他年份,给我看看 id
  • 这是不正确的,因为 id 不应出现在选择列表中 -- 它不在组键中。
  • 这不是问题的答案,这也有点模糊,因为没有明确说明 id 是否应该在所有其他年份或至少一个其他年份重复。
【解决方案2】:

试试这个:你可以通过使用EXISTSHAVING来达到你想要的效果,如下所示:

CREATE TABLE #test(id INT,  year INT)
INSERT INTO #test(id, year) VALUES
(1,     2019),
(1,     2020),
(1,     2021),
(2,     2019),
(3,     2019),
(4,     2018),
(4,     2019)

SELECT t.id 
FROM #test t
WHERE EXISTS(SELECT 1 FROM #test t1 WHERE t.id = t1.id AND t1.year = 2019)
GROUP BY id HAVING COUNT(t.id) > 1

【讨论】:

    【解决方案3】:

    所以有2个条件,第一个是简单的where:year = 2019,第二个是group的条件,如果按id分组,可以写成count(*) > 1。

    但是你不能同时写有where和have的sql,因为where year = 2019会影响分组,只有2019行参与分组,所有计数都是1。

    这可以用子查询来写,以避免上述问题。

    select id
    from table
    where id in (select id from table where year = 2019)
    group by id
    having count(*) > 1
    

    【讨论】:

      【解决方案4】:

      如果您正确地制定了查询要求:

      select id, year, count(*) 
      from table_name tn 
      where tn.year = '2019' 
       and exists (select year 
                   from table_name tn2 
                   where tn2.id = tn.id and tn2.year = '2018') 
       and exists (select year 
                   from table_name tn2 
                   where tn2.id = tn.id and tn2.year = '2020') 
       and exists (select year 
                   from table_name tn2 
                   where tn2.id = tn.id and tn2.year = '2021') 
       group by tn.year 
       having count(*) > 1
      

      【讨论】:

        猜你喜欢
        • 2022-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-21
        • 2021-11-24
        • 2021-12-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多