簡體   English   中英

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM