![](/img/trans.png)
[英]Selecting latest consecutive records that match a condition with PostgreSQL
[英]PostgreSQL sort consecutive records by clusters
我需要按數字順序對一些記錄進行排序。 我需要使用lead()
和lag()
函數,但我不知道如何使用。
****桌子 ****
lote cod_guia box des_prod
1,50731E+14 42012 50434 MERLUZA DEL SUR ENFRIADO REFRIGERADO
1,51E+14 42012 50435 MERLUZA DEL SUR ENFRIADO REFRIGERADO
1,51E+14 42012 50436 MERLUZA DEL SUR ENFRIADO REFRIGERADO
我的SQL
Select
packing_acum.lote as lote_completo,
m_pesaje.cod_guia,
--lag(packing_acum.corr,1) over wt as anterior,
min(packing_acum.corr),
max(packing_acum.corr),
--lead(packing_acum.corr,1) over wt as proximo,
producto.des_prod ,
case when packing.tipo = 1 THEN 'ENFRIADO REFRIGERADO' ELSE 'CONGELADO' end as estado_fresco_o_congelado
From m_pesaje
inner join ( producto
inner join (packing
inner join packing_acum
on packing.cod_packing = packing_acum.cod_packing)
on packing_acum.cod_prod = producto.cod_prod)
on packing_acum.cod_pesaje = m_pesaje.cod_pesaje
where
packing_acum.estado = 5668 and packing_acum.cod_prod <> 0
group by lote_completo,cod_guia,des_prod,estado_fresco_o_congelado
order by
min(packing_acum.corr),max(packing_acum.corr)
結果:
lote cod_guia box_ini box_end des_prod estado_fresco_o_congelado
1,50731E+14 42012 50434 50507 MERLUZA DEL SUR ENFRIADO REFRIGERADO
1,50731E+14 41934 50498 50502 MERLUZA DEL SUR ENFRIADO REFRIGERADO
1,50731E+14 42010 50503 50505 MERLUZA DEL SUR ENFRIADO REFRIGERADO
我需要:
lote cod_guia box_ini box_end des_prod estado_fresco_o_congelado
1,50731E+14 42012 50434 50497 MERLUZA DEL SUR ENFRIADO REFRIGERADO
1,50731E+14 41934 50498 50502 MERLUZA DEL SUR ENFRIADO REFRIGERADO
1,50731E+14 42010 50503 50505 MERLUZA DEL SUR ENFRIADO REFRIGERADO
1,50731E+14 42012 50505 50507 MERLUZA DEL SUR ENFRIADO REFRIGERADO
你的問題是,你必須在連續的“配對”行(由一組連續packing_acum.corr
,通過配對m_pesaje.cod_guia
),或因此它從你提供的數據看起來。 您不能使用lag()
和lead()
窗口函數來執行此操作,因為您沒有適當的PARTITION
功能。 相反,您應該首先在GROUP
上創建一些值,然后可以使用簡單的聚合函數。
看到您沒有提供表定義,示例數據或PostgreSQL版本,以下內容有些guess測,但可能對您有用。
SELECT sub.lote_completo, sub.cod_guia, sub.box_ini, sub.box_end,
producto.des_prod,
CASE WHEN packing.tipo = 1 THEN 'ENFRIADO REFRIGERADO' ELSE 'CONGELADO'
END AS estado_fresco_o_congelado
FROM (
SELECT lote AS lote_completo, cod_guia, cod_packing, cod_prod,
min(corr) AS box_ini, max(corr) AS box_end
FROM (
SELECT pa.lote, pes.cod_guia, pa.corr, pa.cod_packing, pa.cod_prod,
row_number() OVER (ORDER BY pa.corr) -
row_number() OVER (PARTITION BY pes.cod_guia ORDER BY pa.corr) AS cls
FROM packing_acum pa
JOIN m_pesaje pes USING (cod_pesaje)
WHERE pa.estado = 5668
AND pa.cod_prod <> 0) subsub
GROUP BY lote, cod_guia, cod_packing, cod_prod, cls) sub
JOIN producto USING (cod_prod)
JOIN packing USING (cod_packing)
ORDER BY sub.box_ini, sub.box_end;
在subsub
子查詢中的偽類數cls
通過減去在整個表中的行號產生(后中的兩個條件過濾WHERE
子句)在分區中在由行號cod_guia
值。 這給出了編號從0開始,但具有比“盒子”(無特殊值或其他財產pa.corr
)相鄰行與對於相同的值cod_guia
具有相同的cls
值。
在sub
查詢中,您根據該cls
值進行匯總,生成最小和最大包裝盒號,在主查詢中,添加其他必填列。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.