Вот несколько способов в зависимости от того, как вы хотите выбрать оставшиеся значения:
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 |