【问题标题】:Sum unequal and removing duplicates from SQL query results从 SQL 查询结果中求和不相等并删除重复项
【发布时间】:2020-03-26 19:15:43
【问题描述】:

我的基本查询:

SELECT project_id
       name
       stories_produced
       on_date
      FROM project_prod
      WHERE on_date IN ('2017-03-01', '2017-06-10')
      ORDER BY project_id

它可以让我得到这些输出:

输出示例:

id       name                   stories_produced        on_date
1042    project 1               1001 (wanted)           2017-03-01
1042    project 1               1801 (wanted)           2017-06-10
1568    project 2               355  (wanted)           2017-06-10
1405    project 3               1    (not wanted)       2017-03-10
1405    project 3               1    (not wanted)       2017-06-10

Obs:(id, on_date) 有一个限制,这意味着在特定日期总是只能有一个项目生产的记录。

重复的记录,具有相同的 id,并且在两个日期都存在并且具有不同生产值(需要)

单条记录,仅存在于其中一个日期(需要)

问题:*

重复的记录,具有相同的 ID,并且存在于两个日期并且具有相等生产值(不需要)

我当前的查询,需要更改

      select project_id 
        name 
        CASE
          WHEN max(stories_produced) - min(stories_produced) = 0    
          THEN max(stories_produced)
          ELSE max(stories_produced) - min(stories_produced)
        END AS 'stories_produced'
        from project_prod
      WHERE on_date IN ('2017-03-01', '2017-06-10')
      group by project_id;

输出示例:

id       name                   stories_produced        
1042    project 1               800 (wanted)
1568    project 2               355  (wanted)
1405    project 3               1    (not wanted)

CASE 目前处理第三个约束(重复记录,具有相同的 id,并且存在于两个日期并且具有相等的生产值 (不想要) em>)

是否有任何可能的条件可以适应这种情况?

【问题讨论】:

  • 您的数据没有显示与每条记录相关的日期,而这里似乎是一条重要信息。
  • 请阅读meta.stackoverflow.com/questions/333952/…并编辑您的问题
  • 你在第一个基本查询上是对的@GMB,我忘了添加它们。现已编辑

标签: mysql sql database logic


【解决方案1】:

一个选项使用not exists 删除行具有相同id、存在于两个日期且具有相同生产值的行

select
    p.project_id,
    p.name,
    p.stories_produced,
    p.on_date,
  from project_prod p
  where 
    on_date in ('2017-03-01', '2017-06-10')
    and not exists (
        select 1
        from project_prod p1
        where 
            p1.on_date in ('2017-03-01', '2017-06-10')
            and p1.on_date <> p.date
            and p1.id = p.id 
            and p1.stories_produced = p.stories_produced

    )
  order by project_id 

在 MySQL 8.0 中,您可以使用窗口函数:

select
    project_id,
    name,
    stories_produced,
    on_date,
from (
    select 
        p.*,
        min(stories_produced) over(partition by project_id) min_stories_produced,
        max(stories_produced) over(partition by project_id) max_stories_produced,
        count(*) over(partition by project_id) max_stories_produced cnt
    from project_prod p
    where on_date in ('2017-03-01', '2017-06-10')
) t
where not (cnt = 2 and min_stories_produced = max_stories_produced)
oder by project_id

【讨论】:

  • 希望我使用的是版本 8,它更干净
  • 非常感谢! GMB,我只是将 替换为 equal 并且效果很好
猜你喜欢
  • 1970-01-01
  • 2020-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-03
  • 1970-01-01
  • 2021-07-13
相关资源
最近更新 更多