Mi consulta base:
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
Se puede conseguirme estas salidas:
Ejemplo de salida:
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: No hay una restricción en (id, on_date) significa que siempre puede haber sólo un registro de un proyecto de producción en una fecha específica.
Registros duplicados, que tiene el mismo ID, y existen en ambas fechas y tienen diferentes valores de producción (querido)
registros individuales, que existe sólo en una de las fechas (querido)
El problema:*
Registros duplicados, que tiene el mismo ID, y existen en ambas fechas y tienen iguales valores de producción (no quería)
Mi consulta actual, que el cambio necesario
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;
Ejemplo de Salida:
id name stories_produced
1042 project 1 800 (wanted)
1568 project 2 355 (wanted)
1405 project 3 1 (not wanted)
El caso está no tomando el cuidado de la tercera restricción (registros duplicados, que tiene el mismo ID, y existen en ambas fechas y tienen valores de producción igual (no quería) )
¿Hay alguna posible condición que puede acomodar esto?
Uno de ellos utiliza la opción not exists
caigan filas que tienen el mismo identificador, y existen en ambas fechas y tienen iguales valores de producción :
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
En MySQL 8.0, puede utilizar las funciones de ventana:
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