Necesito conservar una fila por grupo de nombres de la tabla:
ID | Name | Attribute1| Attribute2 | Attribute3 1 | john | true | 2012-20-10 | 12345670 2 | john | false | 2015-20-10 | 12345671 3 | james | false | 2010-02-01 | 12345672 4 | james | false | 2010-02-03 | 12345673 5 | james | false | 2010-02-06 | 12345674 6 | sara | true | 2011-02-02 | 12345675 7 | sara | true | 2011-02-02 | 12345676...según criterios especificados. En primer lugar, se deben conservar las filas con verdadero en el Atributo1 (si está presente), luego con la fecha máxima (Atributo2), y si eso no resulta en una fila, la que tiene el Atributo3 máximo.
El resultado deseado es:
ID|Name|Attribute1|Attribute2|Attribute3 1 | john | true | 2012-20-10 | 12345670 5 | james | false | 2010-02-06 | 12345674 7 | sara | true | 2011-02-02 | 12345676Traté de hacer eso con uniones anidadas, pero eso parece ser demasiado complicado. Una solución simple es hacer primero el resultado SQL de ORDER BY:
CREATE TABLE output AS SELECT ID, Name, Attribute1, Attribute2, Attribute3 FROM input ORDER BY Name, Attribute1 DESC, Attribute2 DESC, Attribute3 DESC;y haga el ciclo para cada fila y verifique y almacene en caché si el nombre ocurrió antes; si no, consérvelo (y almacene el nombre en alguna variable global), de lo contrario, elimine la fila.
¿Hay alguna otra solución de SQL puro?
Para PostgreSQL:
select distinct on (name) * from t order by name, attribute1 desc, attribute2 desc, attribute3 deschttps://www.postgresql.org/docs/current/static/sql-select.html#SQL-DISTINCT