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