ORA-00923: ключевое слово FROM не найдено там, где ожидалось

Я получаю следующую ошибку

«ORA-00923: ключевое слово FROM не найдено там, где ожидалось» при выполнении запроса.

SELECT 
    count(pf.pref_selection) filter ( WHERE pc.collection = "players")      OVER (partition BY pc.collection,pc.user_id )  AS Avg_players        
    count(pf.pref_selection) filter ( WHERE pc.collection = "teams")        OVER (partition BY pc.collection,pc.user_id )  AS Avg_teams  
FROM NBA_OWNER.PREFERENCES pf 
inner join NBA_OWNER.PREF_COLLECTIONS pc on pc.ID=pf.COLLECTION_ID 
where pc.LAST_UPDATE_DATE>"30-SEP-16'`

person Siddesh Prabhu Malkarnekar    schedule 07.02.2017    source источник
comment
Это форматирование помогает? У вас нет запятых между столбцами SELECT   -  person OneCricketeer    schedule 08.02.2017
comment
Где вы нашли этот синтаксис? filter и where в скобках недействительны. Также кажется странным использование здесь аналитических подсчетов; вы получите обратно много строк, но не будете знать, к какому идентификатору пользователя они относятся. Вы уверены, что не хотите использовать совокупные подсчеты и включать пользователя в список выбора?   -  person Alex Poole    schedule 08.02.2017
comment
@AlexPoole: предложение filter на самом деле является частью стандарта SQL, но Oracle его не поддерживает.   -  person a_horse_with_no_name    schedule 08.02.2017


Ответы (1)


У вас несколько ошибок. Как указано в @ cricket_007, вам не хватает запятой между двумя выражениями счетчика. Но у вас также есть недопустимый синтаксис с вашим предложением filter, которого не существует, по крайней мере, в Oracle; вы использовали двойные кавычки вокруг строковых литералов вместо одинарных кавычек; кавычки вокруг строки даты еще более странные; и вы полагаетесь на настройки NLS для формата даты.

Это ближе к тому, что вам нужно, если я понимаю, что вы пытались:

SELECT 
    count(case when pc.collection = 'players' then pf.pref_selection end)
      OVER (partition BY pc.user_id) AS Avg_players, 
    count(case when pc.collection = 'teams' then pf.pref_selection end)
      OVER (partition BY pc.user_id) AS Avg_teams  
FROM NBA_OWNER.PREFERENCES pf 
inner join NBA_OWNER.PREF_COLLECTIONS pc on pc.ID=pf.COLLECTION_ID 
where pc.LAST_UPDATE_DATE > date '2016-09-30'

Однако вывод может быть не очень полезным. Для каждого идентификатора пользователя вы можете получить несколько строк, каждая из которых показывает общее количество (которое вы почему-то назвали avg). Вероятно, вы захотите увидеть счетчики для каждого идентификатора только один раз и увидеть, к какому идентификатору они относятся, поэтому я думаю, вам нужен совокупный, а не аналитический счет:

SELECT 
    pc.user_id,
    count(case when pc.collection = 'players' then pf.pref_selection end)
      AS Avg_players,      
    count(case when pc.collection = 'teams' then pf.pref_selection end)
      AS Avg_teams  
FROM NBA_OWNER.PREFERENCES pf 
inner join NBA_OWNER.PREF_COLLECTIONS pc on pc.ID=pf.COLLECTION_ID 
where pc.LAST_UPDATE_DATE > date '2016-09-30'
group by pc.user_id
person Alex Poole    schedule 07.02.2017
comment
Предложение filter действительно является стандартным SQL, но, как вы отметили, Oracle не поддерживает его. - person a_horse_with_no_name; 08.02.2017
comment
У меня было ощущение, что это может быть, и вы бы знали * 8-) Ни одного я не видел даже мимоходом, из моего закрытого мира оракулов. Спасибо. - person Alex Poole; 08.02.2017
comment
Насколько мне известно, в настоящее время это поддерживают только Postgres и HSQLDB. - person a_horse_with_no_name; 08.02.2017
comment
Спасибо за ваш ответ всем. Я на самом деле пытаюсь найти среднее количество пользователей, которые выбрали игроков, и среднее количество пользователей, которые выбрали команды. Есть ли у вас какие-нибудь предложения для меня. Спасибо - person Siddesh Prabhu Malkarnekar; 09.02.2017