Этот запрос выдает требуемый вывод
<code>
SELECT AD.STRPRODUCTNUMBER,
WM_CONCAT(AD.JOIN_VAL) AS JOIN_VAL
FROM
(SELECT A1.STRPRODUCTNUMBER,
DECODE(TO_CHAR(A1.LGNDOFFID, '999999'),
TO_CHAR(A2.LGNDOFFID, '999999'),
TO_CHAR(A1.LGNDOFFID, '999999'),
TO_CHAR(A2.LGNDOFFID, '999999') || '-' || TO_CHAR(A1.LGNDOFFID, '999999')) AS JOIN_VAL
FROM (SELECT A.STRPRODUCTNUMBER, A.LGNDOFFID, ROWNUM AS ROW_NUM
FROM (SELECT DISTINCT BT.STRPRODUCTNUMBER,
BT.LGNDOFFID,
DECODE((SELECT DISTINCT BT1.LGNDOFFID
FROM SO_BUFFER_TABLE_5 BT1
WHERE BT1.STRPRODUCTNUMBER =
BT.STRPRODUCTNUMBER
AND (BT1.LGNDOFFID =
BT.LGNDOFFID + 1)),
NULL,
'FALSE',
'TRUE') AS NEXT_VAL_EXIST
FROM SO_BUFFER_TABLE_5 BT
ORDER BY BT.STRPRODUCTNUMBER) A
WHERE A.NEXT_VAL_EXIST = 'FALSE') A1,
(SELECT A.STRPRODUCTNUMBER, A.LGNDOFFID, ROWNUM AS ROW_NUM
FROM (SELECT DISTINCT BT.STRPRODUCTNUMBER,
BT.LGNDOFFID,
DECODE((SELECT DISTINCT BT1.LGNDOFFID
FROM SO_BUFFER_TABLE_5 BT1
WHERE BT1.STRPRODUCTNUMBER =
BT.STRPRODUCTNUMBER
AND (BT1.LGNDOFFID =
BT.LGNDOFFID + 1)),
NULL,
'FALSE',
'TRUE') AS NEXT_VAL_EXIST
FROM SO_BUFFER_TABLE_5 BT
ORDER BY BT.STRPRODUCTNUMBER) A
WHERE DECODE((SELECT DISTINCT BT.LGNDOFFID
FROM SO_BUFFER_TABLE_5 BT
WHERE BT.STRPRODUCTNUMBER = A.STRPRODUCTNUMBER
AND (BT.LGNDOFFID + 1 = A.LGNDOFFID)),
NULL,
'FALSE',
'TRUE') = 'FALSE') A2
WHERE A1.STRPRODUCTNUMBER = A2.STRPRODUCTNUMBER
AND A1.ROW_NUM = A2.ROW_NUM) AD
GROUP BY AD.STRPRODUCTNUMBER
Основной запрос состоит из 2 подзапросов: A1 и A2. A1 извлекает верхний предел значений
<code>
20170L 876190 1
20170L 876207 2
20170L 876212 3
20170L 876215 4
20180T 876200 5
20180T 876211 6
* 1006.*
, в то время как запрос A2 извлекает нижний предел
<code>
20170L 876190 1
20170L 876205 2
20170L 876209 3
20170L 876215 4
20180T 876200 5
20180T 876205 6
Затем я объединил их, чтобы получить такой вывод
<code>
20170L 876190
20170L 876205- 876207
20170L 876209- 876212
20170L 876215
20180T 876200
20180T 876205- 876211
IЯ использовал rownum в качестве идентификатора для сопоставления с соответствующими значениями.
Наконец, я использовал функцию WM_CONCAT для объединения значений, чтобы получить выходные данные, такие как
<code>
20170L 876190, 876205- 876207, 876209- 876212, 876215
20180T 876200, 876205- 876211
Надеюсь, это поможет