Интересно, что вы можете сделать это рекурсивно:
WITH Ordered_Data (product_id, orderIndex, dataString) as (
SELECT product_id, location, partnumber, price, status,
ROW_NUMBER() OVER(PARTITION_BY product_id ORDER BY product_id, location ASC),
product_id || '|' || location || '|' || partnumber || '|' ||
price || '|' || status
FROM Product_Location),
Combined_Data(product_id, orderIndex, dataString) as (
SELECT a.product_id, a.orderIndex, a.dataString
FROM Ordered_Data as a
JOIN (SELECT product_id, MAX(orderIndex) as orderIndex
FROM Ordered_Data
GROUP BY product_id) as b
ON b.product_id = a.product_id
AND b.orderIndex = a.orderIndex
UNION ALL
SELECT b.product_id, a.orderIndex, b.dataString || ',' || a.dataString
FROM Ordered_Data as a
JOIN Combined_Data as b
ON b.product_id = a.product_id
AND b.orderIndex - 1 = a.orderIndex)
SELECT dataString
FROM Combined_Data
WHERE orderIndex = 1
Что дает ожидаемое:
9876543210|9999|3333|15.99|A,9876543210|4444|3333|14.99|A
1234567890|9999|5555|10.99|A,1234567890|8888|5555|11.99|A,1234567890|7777|5555|9.99|B
Я не даю никаких гарантий того, как быстро это будет выполняться -в частности, вы захотите, чтобы индекс превысил (product_id
, location
) (или аналогичный, и измените оператор).Я считаю, что DB2 достаточно умна, чтобы читать индикаторы в обратном направлении, поэтому направление не должно иметь большого значения.
В качестве примечания я действительно надеюсь price
- это numeric
или decimal
(точные десятичные дроби), а не float
или real
.