как избежать этого сценария ниже получить уникальную ценность - PullRequest
0 голосов
/ 17 мая 2018

как избежать этого нижеприведенного сценария, получить уникальное значение

INPUT
id  bike  car   bus  htv
ss   Y    N      N    Y
ss   N    N      N    Y
KK   Y    N      N    Y
KK   N    N      N    Y

OUTPUT (expected)
id  bike  car   bus  htv
ss   Y    N      N    Y
KK   Y    N      N    Y

Вы можете поделиться запросом для полезного?

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Вот несколько способов в зависимости от того, как вы хотите выбрать оставшиеся значения:

SQL Fiddle

Настройка схемы Oracle 11g R2 :

CREATE TABLE table_name ( id, bike, car, bus, htv ) AS
SELECT 'ss', 'Y', 'N', 'N', 'Y' FROM DUAL UNION ALL
SELECT 'ss', 'N', 'N', 'N', 'Y' FROM DUAL UNION ALL
SELECT 'KK', 'Y', 'N', 'N', 'Y' FROM DUAL UNION ALL
SELECT 'KK', 'N', 'N', 'N', 'Y' FROM DUAL;

Запрос 1 : получить максимальное значение для каждого столбца для каждой группы идентификаторов:

SELECT id,
       MAX( bike ) AS bike,
       MAX( car  ) AS car,
       MAX( bus  ) AS bus,
       MAX( htv  ) AS htv
FROM   table_name
GROUP BY id

Результаты

| ID | BIKE | CAR | BUS | HTV |
|----|------|-----|-----|-----|
| ss |    Y |   N |   N |   Y |
| KK |    Y |   N |   N |   Y |

Запрос 2 : Получить первую найденную строку в каждой группе идентификаторов:

SELECT id, bike, car, bus, htv
FROM   (
  SELECT t.*,
         ROW_NUMBER() OVER ( PARTITION BY id ORDER BY ROWNUM ) AS rn
  FROM   table_name t
)
WHERE  rn = 1

Результаты

| ID | BIKE | CAR | BUS | HTV |
|----|------|-----|-----|-----|
| KK |    Y |   N |   N |   Y |
| ss |    Y |   N |   N |   Y |

Запрос 3 : получить строку с самым высоким bike, затем самым высоким car, затем самым высоким bus, затем самым высоким htv для каждого id:

SELECT id, bike, car, bus, htv
FROM   (
  SELECT t.*,
         ROW_NUMBER() OVER (
           PARTITION BY id
           ORDER BY bike DESC, car DESC, bus DESC, htv DESC
         ) AS rn
  FROM   table_name t
)
WHERE  rn = 1

Результаты :

| ID | BIKE | CAR | BUS | HTV |
|----|------|-----|-----|-----|
| KK |    Y |   N |   N |   Y |
| ss |    Y |   N |   N |   Y |

Запрос 4 : получить строку с наибольшим числом Y столбцов для каждой id группы:

SELECT id, bike, car, bus, htv
FROM   (
  SELECT t.*,
         ROW_NUMBER() OVER (
           PARTITION BY id
           ORDER BY
               DECODE( bike, 'Y', 1, 0 )
             + DECODE( car,  'Y', 1, 0 )
             + DECODE( bus,  'Y', 1, 0 )
             + DECODE( htv,  'Y', 1, 0 ) DESC,
             ROWNUM
         ) AS rn
  FROM   table_name t
)
WHERE  rn = 1

Результаты

| ID | BIKE | CAR | BUS | HTV |
|----|------|-----|-----|-----|
| KK |    Y |   N |   N |   Y |
| ss |    Y |   N |   N |   Y |
0 голосов
/ 17 мая 2018

Я думаю, что вы можете просто собрать и взять максимум каждого столбца:

SELECT
    id, MAX(bike) AS bike, MAX(car) AS car, MAX(bus) AS bus, MAD(htv) AS htv
FROM yourTable
GROUP BY id

Причина, по которой это должно работать, заключается в том, что Y (для да) лексикографически больше, чем N (для нет). Таким образом, если для заданного id будет хотя бы одно значение yes, в приведенном выше запросе будет указано yes. Он сообщал бы только «нет» в том случае, если у данного столбца нет нигде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...