[英]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.