Вывести только максимальное значение в столбце - PullRequest
2 голосов
/ 23 января 2020

У меня есть скрипт, я ввожу в него данные, но есть одна проблема, которую я не могу решить. У меня есть повторяющиеся значения. Все из-за привязки ИНФО. В столбце INFO у меня может быть либо ничего, либо какое-то значение. Тогда я только печатаю значение (это то, что я решил). Но это может быть, когда есть два курса, один меньше, а другой больше, вытесняя только максимум. Спасибо за вашу помощь) https://dbfiddle.uk/?rdbms=oracle_18&fiddle=6edb8b040779522cca52802748bc3918 Теперь ответ таков:

+ --------+---------------+--------------------------------------+-------------------+
| ID      | VALUE_NUMBER  | VALUE_STRING                         | INFO              |
+ --------+---------------+--------------------------------------+-------------------+
| 4680828 | 1578109515974 | aedef9f9-2e82-11ea-80cb-e03f49835a25 | 95888137 MY_IDENT |
| 4680704 | 1578109515974 | aedef9f9-2e82-11ea-80cb-e03f49835a25 | MY_IDENT          |
| 4680828 | 1578109515974 | aedef9f9-2e82-11ea-80cb-e03f49835a25 | MY_IDENT          |
| 4680704 | 1578109515974 | aedef9f9-2e82-11ea-80cb-e03f49835a25 | 95888137 MY_IDEN  |
+ --------+---------------+--------------------------------------+-------------------+

И я хочу go вот так

+ --------+---------------+--------------------------------------+-------------------+
| ID      | VALUE_NUMBER  | VALUE_STRING                         | INFO              |
+ --------+---------------+--------------------------------------+-------------------+
| 4680828 | 1578109515974 | aedef9f9-2e82-11ea-80cb-e03f49835a25 | 95888137 MY_IDENT |
| 4680704 | 1578109515974 | aedef9f9-2e82-11ea-80cb-e03f49835a25 | 95888137 MY_IDENT |
+ --------+---------------+--------------------------------------+-------------------+

Ответы [ 4 ]

3 голосов
/ 23 января 2020

Агрегаты (такие как 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>
1 голос
/ 23 января 2020

Таблицы ключей / значений - трудная задача для работы. Типичный способ go об этом - использовать агрегирование, чтобы получить значения, объединенные в строку, как если бы это была строка в обычной таблице.

with data as
(
  select
    parent,
    max(case when key = 'transaction' then value_number end) as transaction,
    max(case when key = 'reader' then value_string end) as reader,
    max(case when key = 'truck1' then value_number end) as truck1_number,
    max(case when key = 'truck1' then value_string end) as truck1_string,
    max(case when key = 'truck2' then value_number end) as truck2_string,
    max(case when key = 'item_name' then value_string end) as item_name
  from iot_stream_analytics_log_representation
  group by parent
)
select
  transaction,
  reader,
  trim(truck1_string || ' ' || truck1_number || ' ' || item_name || ' ' || truck2_string)
    as info
from data
where reader = 'aedef9f9-2e82-11ea-80cb-e03f49835a25' and transaction <> 0
order by transaction;

В результате получается

+ --------------+--------------------------------------+-------------------+
| TRANSACTION   | READER                               | INFO              |
+ --------------+--------------------------------------+-------------------+
| 1578109515974 | aedef9f9-2e82-11ea-80cb-e03f49835a25 | MY_IDENT          |
| 1578109515974 | aedef9f9-2e82-11ea-80cb-e03f49835a25 | 95888137 MY_IDENT |
+ --------------+--------------------------------------+-------------------+

, то есть две строки, поскольку в таблице есть две совпадающие записи (два родительских значения).

Демонстрация: https://dbfiddle.uk/?rdbms=oracle_18&fiddle=27b65b47d30eeae85098b8d32678688f

1 голос
/ 23 января 2020

Агрегаты (например, макс.) Обычно помогают

select * from your_table where INFO  =  (Select max(INFO) from your_table)
1 голос
/ 23 января 2020

Следующий запрос даст ожидаемый результат.

select * from test where length(INFO) in (select max(length(INFO)) from test 
group by ID,VALUE_NUMBER);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...