繁体   English   中英

求和不相等并从 SQL 查询结果中删除重复项

[英]Sum unequal and removing duplicates from SQL query results

我的基本查询:

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,并且存在于两个日期并且具有 EQUAL 生产值(不需要)

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

一种选择使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM