Невозможно запросить данные из таблицы базы данных Oracle - PullRequest
0 голосов
/ 06 марта 2020

У меня есть таблица, которая возвращает следующий вывод:

SELECT * FROM MEMBER_ACHIEVEMENTS;
--------------------------------------------------------
| CATEGORY_ID | MEMBER_ID | MILESTONE | MILESTONE_DATE |
--------------------------------------------------------
|   GOLF      |    1001   |   WINNER  |   23-JAN-2019  |
|   GOLF      |    1001   |   SECOND  |   12-AUG-2019  |
|   GOLF      |    1001   |   THIRD   |   18-DEC-2018  |
|   GOLF      |    1002   |   WINNER  |   11-FEB-2018  |
|   GOLF      |    1003   |   SECOND  |   17-APR-2018  |
|   GOLF      |    1003   |   WINNER  |   30-MAR-2019  |
|   GOLF      |    1004   |   SECOND  |   10-JUN-2017  |
|   GOLF      |    1004   |   WINNER  |   15-JAN-2019  |
|   GOLF      |    1004   |   SECOND  |   19-FEB-2019  |
--------------------------------------------------------

Я хотел бы отобразить CATEGORY_ID и MEMBER_ID для всех участников, которые имеют MILESTONE = 'WINNER' и имеют другую веху с MILESTONE_DATE больше (позже), чем дата MILESTONE = 'WINNER' и MILESTONE <> 'WINNER'.

Ожидаемый вывод:

---------------------------
| CATEGORY_ID | MEMBER_ID |
---------------------------
|   GOLF      |    1001   |
|   GOLF      |    1004   |
---------------------------

Я попытался выполнить запрос :

SELECT CATEGORY_ID, MEMBER_ID FROM MEMBER_ACHIEVEMENTS WHERE MEMBER_ID IN 
(
 SELECT CATEGORY_ID, MEMBER_ID FROM MEMBER_ACHIEVEMENTS WHERE MILESTONE_DATE >
 (
  SELECT CATEGORY_ID, MEMBER_ID, MILESTONE_DATE FROM MEMBER_ACHIEVEMENTS WHERE MILESTONE='WINNER'
 )
);

Я был бы очень благодарен, если бы кто-нибудь мог помочь мне исправить этот запрос.

1 Ответ

2 голосов
/ 06 марта 2020

Вы можете использовать агрегацию, чтобы увидеть, есть ли другая дата позже, чем самый последний «победитель» - вот, что я думаю, вы спрашиваете:

select category_id, member_id
from member_achievements ma
group by category_id, member_id
having max(milestone_date) > max(case when milestone = 'WINNER' then milestone_date end) ;

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

select category_id, member_id
from member_achievements ma
group by category_id, member_id
having (max(case when milestone <> 'WINNER' then milestone_date end) >
        min(case when milestone = 'WINNER' then milestone_date end)
       );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...