SQL-获取并替换查询字段的最小值

时间:2015-04-16 16:26:02

标签: sql postgresql

我在Postgresql中有以下查询:

SELECT mq.nombre,sa.nombre,COUNT(DISTINCT(ae.numero_serie)),SUM(im.fin-im.inicio),MIN(pz.fecha_inicio)
FROM item_metraje AS im LEFT JOIN articulo_especificado AS ae ON (im.id_articulo_especificado = ae.id) 
            LEFT JOIN articulo AS a ON (ae.id_articulo = a.id)
            LEFT JOIN serie_articulo AS sa ON (a.id_serie_articulo = sa.id)
            LEFT JOIN reporte_perforacion AS rp ON (rp.id = im.id_reporte_perforacion) 
            LEFT JOIN pozo AS pz ON (pz.id=rp.id_pozo) LEFT JOIN proyecto AS p ON (p.id=pz.id_proyecto) 
            LEFT JOIN maquina_perforacion AS mq ON (mq.id = pz.id_maquina)
WHERE p.id = 2 GROUP BY mq.nombre,sa.nombre

结果是:

enter image description here

但是我想为具有相同值的字段'nombre'的行设置最小日期,例如对于值'JM04',三行必须具有日期2015-01-25,因为它是三行的最小值。

对不起我的英语,感谢所有人。

1 个答案:

答案 0 :(得分:1)

您可以使用Window functions来实现此目的。 MIN(pz.fecha_inicio) over (partition by mq.nombre)
因此最后的查询是,

SELECT z.nombre1,z.nombre2,z.count,z.sum ,MIN(z.date) over (partition by z.nombre1) from
(SELECT mq.nombre as nombre1 ,sa.nombre as nombre2,COUNT(DISTINCT(ae.numero_serie)) as count,SUM(im.fin-im.inicio) as sum ,pz.fecha_inicio as date
FROM item_metraje AS im LEFT JOIN articulo_especificado AS ae ON (im.id_articulo_especificado = ae.id) 
            LEFT JOIN articulo AS a ON (ae.id_articulo = a.id)
            LEFT JOIN serie_articulo AS sa ON (a.id_serie_articulo = sa.id)
            LEFT JOIN reporte_perforacion AS rp ON (rp.id = im.id_reporte_perforacion) 
            LEFT JOIN pozo AS pz ON (pz.id=rp.id_pozo) LEFT JOIN proyecto AS p ON (p.id=pz.id_proyecto) 
            LEFT JOIN maquina_perforacion AS mq ON (mq.id = pz.id_maquina)
WHERE p.id = 2 GROUP BY mq.nombre,sa.nombre)z   

您可以根据需要在窗口函数内的order byhaving子句的帮助下对其进行修改。我用自己的数据集试过这个。希望这可以帮助。