DATA given:
inventory_num_id inventory_group_id num code
9681066 100003894 211 E
9679839 100003894 212 E
9687165 100003894 213 E
9680883 100003894 214 I
9710863 100003894 515 E
9681246 100003894 516 E
9682695 100003894 517 E
9681239 100003894 518 E
9685409 100003894 519 E
9679843 100003894 520 C
9679844 100003894 521 C
9714882 100003894 522 E
9679845 100003894 523 I
9681211 100003894 524 E
9681216 100003894 525 E
9682696 100003894 526 E
9681227 100003894 527 E
Result examples should be like:
inventory_group_id code start end
------------------ ---- ----- ----
100003894 E 211 213
100003894 I 214
100003894 E 515 519
100003894 C 520 521
100003894 E 522
100003894 I 523
100003894 E 524 527
What operator should I use to make start as minimum and end as max value? And could you please explain what I should do when the end(maximum)is not supposed to present?
Can I use GROUP BY clause there somehow?
Ann, be careful on the dark side of sql. There are more than one way to do it. Here is the answer:
SELECT a.inventory_group_id,
a.code,
a.num AS "start",
decode(b.num,a.num,null,b.num) AS "end" FROM
( SELECT inventory_num_id,inventory_group_id,code,num
, ROW_NUMBER() OVER (PARTITION BY inventory_group_id,code ORDER BY num) AS rn
FROM inventory_num a
WHERE NOT EXISTS
( SELECT *
FROM inventory_num prev
WHERE prev.inventory_group_id = a.inventory_group_id
and PREV.CODE = a.code
AND prev.num = a.num - 1
)
) a
JOIN
( SELECT inventory_num_id,inventory_group_id,code, num
, ROW_NUMBER() OVER (PARTITION BY inventory_group_id,code ORDER BY num) AS rn
FROM inventory_num a
WHERE NOT EXISTS
( SELECT *
FROM inventory_num next
WHERE next.inventory_group_id = a.inventory_group_id
and next.CODE = a.code
AND next.num = a.num + 1
)
) b
ON b.inventory_group_id = a.inventory_group_id and b.code = a.code
AND b.rn = a.rn
order by 3;
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With