Агрегаты (такие как max
) обычно помогают:
select id, value_number, value_string,
max(info) as info --> this
from your_table
group by id, value_number, value_string;
Ваш запрос (из dBFiddle), фиксированный:
WITH txn
AS ( SELECT TRANSACTION_VALUE_NUMBER,
READER_VALUE_STRING,
ID,
MAX (info) AS info
FROM ( SELECT o.VALUE_NUMBER AS transaction_value_number,
i.VALUE_STRING AS reader_value_string,
o.id,
TRIM (
v.VALUE_STRING
|| ' '
|| v.VALUE_NUMBER
|| ' '
|| x.VALUE_STRING
|| ' '
|| c.VALUE_STRING)
AS INFO
FROM IOT_STREAM_ANALYTICS_LOG_REPRESENTATION o
LEFT JOIN IOT_STREAM_ANALYTICS_LOG_REPRESENTATION i ON o.parent = i.parent
LEFT JOIN IOT_STREAM_ANALYTICS_LOG_REPRESENTATION v
ON i.parent = v.parent
AND v.KEY = 'truck1'
LEFT JOIN IOT_STREAM_ANALYTICS_LOG_REPRESENTATION x
ON i.parent = x.parent
AND x.KEY = 'item_name'
LEFT JOIN IOT_STREAM_ANALYTICS_LOG_REPRESENTATION c
ON x.parent = c.parent
AND c.KEY = 'truck2'
WHERE i.key = 'reader'
AND i.VALUE_STRING =
'aedef9f9-2e82-11ea-80cb-e03f49835a25'
AND o.key = 'transaction'
AND o.value_number <> 0
AND TRIM (
v.VALUE_STRING
|| ' '
|| v.VALUE_NUMBER
|| ' '
|| x.VALUE_STRING
|| ' '
|| c.VALUE_STRING)
IS NOT NULL
GROUP BY o.id,
o.VALUE_NUMBER,
i.VALUE_STRING,
TRIM (
v.VALUE_STRING
|| ' '
|| v.VALUE_NUMBER
|| ' '
|| x.VALUE_STRING
|| ' '
|| c.VALUE_STRING))
GROUP BY TRANSACTION_VALUE_NUMBER, READER_VALUE_STRING, ID)
SELECT rep.id,
rep.VALUE_NUMBER,
txn.reader_value_string AS VALUE_STRING,
min(txn.INFO) info
FROM IOT_STREAM_ANALYTICS_LOG_REPRESENTATION rep JOIN txn ON rep.VALUE_NUMBER = txn.transaction_value_number
WHERE LOWER (rep.key) = 'transaction'
AND rep.value_number <> 0
GROUP BY rep.id,
rep.value_number,
txn.reader_value_string;
[EDIT]
Относительно оставленного вами комментария:
НОМЕР ЗНАЧЕНИЯ может отличаться, но ИНФО должен быть одинаковым
Если вы применяете MIN
в его * Если в форме 1019 * analyti c (и, следовательно, удалить все предложение GROUP BY
) последние несколько строк (а также результат) в вашем запросе будут выглядеть следующим образом:
<snip>
55 SELECT rep.id,
56 rep.VALUE_NUMBER,
57 txn.reader_value_string AS VALUE_STRING,
58 min(txn.INFO) over (partition by txn.reader_value_string) info
59 FROM iot rep JOIN txn ON rep.VALUE_NUMBER = txn.transaction_value_number
60 WHERE LOWER (rep.key) = 'transaction'
61 AND rep.value_number <> 0;
ID VALUE_NUMBER VALUE_STRING INFO
---------- --------------- ---------------------------------------- --------------------
4680828 1578109515971 aedef9f9-2e82-11ea-80cb-e03f49835a25 95888137 MY_IDENT
4680704 1578109515974 aedef9f9-2e82-11ea-80cb-e03f49835a25 95888137 MY_IDENT
SQL>
[EDIT # 2]
С новыми данными о dbFiddle, это поможет? Удалить функцию analyti c, включить две MIN
s (одна для REP.ID
, другая для TXN.INFO
):
<snip>
54 SELECT MIN (rep.id) id,
55 rep.VALUE_NUMBER,
56 txn.reader_value_string AS VALUE_STRING,
57 MIN (txn.INFO) info
58 FROM IOT_STREAM_ANALYTICS_LOG_REPRESENTATION rep
59 LEFT JOIN txn ON rep.VALUE_NUMBER = txn.transaction_value_number
60 WHERE LOWER (rep.key) = 'transaction'
61 AND rep.value_number <> 0
62 AND rep.id NOT IN (SELECT o.id
63 FROM IOT_STREAM_ANALYTICS_LOG_REPRESENTATION o,
64 IOT_STREAM_ANALYTICS_LOG_REPRESENTATION parent
65 WHERE o.parent = parent.parent
66 AND parent.key = 'reader'
67 AND parent.VALUE_STRING !=
68 txn.reader_value_string)
69 GROUP BY rep.value_number, txn.reader_value_string;
ID VALUE_NUMBER VALUE_STRING INFO
---------- --------------- ---------------------------------------- --------------------
4680704 1578109515974 aedef9f9-2e82-11ea-80cb-e03f49835a25 95888137 MY_IDENT
4680501 1578109515974 aedef9f9-2e82-11ea-80cb-e03f49835a26 95888138
SQL>