给出的数据:
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
结果示例应类似于:
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
我应该使用什么运算符来使开始值为最小值,结束值为最大值?你能解释一下当结束(最大)不应该出现时我应该做什么吗?
我可以在那里使用 GROUP BY 子句吗?
安,小心 SQL 的阴暗面。
有不止一种方法可以做到这一点。
答案如下:
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;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)