Resumiendo duplicados desiguales y la eliminación de resultados de la consulta SQL

queroga_vqz:

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?

GMB:

Uno de ellos utiliza la opción not existscaigan 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

Supongo que te gusta

Origin http://10.200.1.11:23101/article/api/json?id=373561&siteId=1
Recomendado
Clasificación