Суммирование неравных и удаление дубликатов из SQL результатов запроса - PullRequest
0 голосов
/ 26 марта 2020

Мой базовый запрос:

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) означает, что на указанную c дату всегда может быть только одна запись о создании проекта.

Дублирующиеся записи, имеющие одинаковый идентификатор и существующие в обеих датах и ​​имеющие разные производственные значения (требуется)

Отдельные записи, которые существуют только в одну из дат (требуется)

Проблема: *

Дубликаты записей, которые имеют одинаковый идентификатор и существуют в обеих датах и ​​имеют равные производственные значения (не требуется)

Мой текущий запрос, нуждающиеся в изменении

      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 в настоящее время не , заботясь о третьем ограничении (повторяющиеся записи, имеющие одинаковый идентификатор и существуют в обеих датах и ​​имеют РАВНЫЕ производственные значения (не требуется) )

Есть ли возможность условие, которое может приспособить это?

1 Ответ

1 голос
/ 26 марта 2020

Одна опция использует not exists для удаления строк , которые имеют одинаковый идентификатор, существуют в обеих датах и ​​имеют равные производственные значения :

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
...