2015-09-07 3 views
0

Мне нужно отсортировать несколько записей последовательно с помощью числового значения. Мне нужно использовать функции lead() и lag(), но у меня нет идеи, как это сделать.PostgreSQL сортирует последовательные записи кластеров

**** Таблица ****

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 
+1

Просьба дать больше контекста, его непонятно, что должен делать ваш SQL, и почему у результата, который вам нужен, больше записей, чем результат, который вы получаете – frankpinto

+0

спасибо ... посмотрите таблицу результатов и посмотрите результат таблицы, чтобы i хочу ... Мне нужно отделить число для последовательных значений ... min_value (box-ini) -> max_value (box-end) – user5310316

+0

Я до сих пор не совсем понимаю. Вам также нужно будет указать * input *, т. Е. Таблицу (таблицы) и данные. –

ответ

0

Ваша проблема заключается в том, что вам необходимо группировать последовательные «парные» строки (последовательные по packing_acum.corr, в паре m_pesaje.cod_guia), или так кажется из данных, которые вы поставляете. Вы не можете сделать это с помощью функций окна lag() и lead(), потому что у вас нет ничего подходящего PARTITION. Вместо этого вы должны сначала создать некоторое значение до GROUP, тогда вы можете использовать простые агрегатные функции.

Учитывая, что вы не предоставляете определения таблиц, образцы данных или версию PostgreSQL, нижеследующее несколько догадок, но это может сработать для вас.

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, генерируя минимальные и максимальные номера полей, а в основном запросе добавляете другие необходимые столбцы.

+0

THX много .. этот вопрос является удивительным. но у меня есть проблема .. 1.- sub и subsub qry work .., но когда я запускаю весь запрос, вы получаете ошибку в соединении – user5310316

+0

thx много .. этот запрос является потрясающим. но у меня проблема ..
, когда я запускаю весь запрос, дает ошибку в соединении
say Ошибка: столбец «cod_prod», указанный в предложении USING, не существует в левой таблице. Состояние SQL: 42703, thx снова. – user5310316

+0

Спасибо, что указали это. Оба 'cod_prod' и' cod_packing' находятся в подзапросе 'subsub', но они также должны быть в списке выбора подзапроса' sub' и 'GROUP BY'. См. Обновленный ответ. – Patrick