SQLクエリの結果から、合計不平等と削除重複

queroga_vqz:

私のベースのクエリ:

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:常に特定の日のプロジェクトの生産の1つのレコードのみが存在することができるという意味(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生産値を持つ重複レコード、世話をしたかったではない)(

これを収容することができますすべての可能な条件はありますか?

GMB:

一つのオプションが使用する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

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=373557&siteId=1