Я запутался, увидев эту ошибку: неправильный синтаксис рядом с ключевым словом "ГДЕ" mysql - PullRequest
0 голосов
/ 23 января 2020

Где я сделал не так?

SELECT constituency,party, votes
FROM    (SELECT constituency,party, votes, RANK() OVER (ORDER BY votes DESC) as posn
        FROM ge WHERE posn =1 and yr  = 2017 )
WHERE constituency BETWEEN 'S14000021' AND 'S14000026'
ORDER BY constituency,votes DESC

Ответы [ 2 ]

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

Ваш оригинальный запрос будет написан так:

SELECT constituency, party, votes
FROM (SELECT ge.*,
             RANK() OVER (ORDER BY votes DESC) as posn
      FROM ge
      WHERE constituency BETWEEN 'S14000021' AND 'S14000026' AND
            yr = 2017
     ) ge
WHERE posn = 1 
ORDER BY constituency, votes DESC;

Это исправляет псевдоним, использование pos в предложении where и помещает фильтрацию в подзапрос (не ошибка но рекомендуется в MySQL).

Возвращает избирательный округ или избирательные округа, которые имеют одинаковые максимальные голоса.

Если вы хотите, чтобы победитель в каждом избирательном округе, вы хотите partition by constituency в rank(). Однако это предположение, и оно не связано с тем, почему ваш исходный запрос не компилируется.

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

Попробуйте указать псевдоним для своего подзапроса:

SELECT s.constituency,s.party, s.votes 
FROM  (
   SELECT constituency,party, votes, RANK() OVER (ORDER BY votes DESC) as posn 
   FROM ge 
   WHERE posn =1 and yr  = 2017 ) s
WHERE s.constituency BETWEEN 'S14000021' AND 'S14000026'
ORDER BY s.constituency,s.votes DESC

Что касается примечания, я не совсем уверен, что использование between в столбце string даст вам желаемые результаты, может быть лучше сделать это вместо:

s.constituency in ('S14000021', 'S14000022', 'S14000023', 
                   'S14000024', 'S14000025' 'S14000026')

Отредактированный запрос

Похоже, вы пытаетесь выяснить, кто набрал наибольшее количество голосов в избирательном округе, поэтому запрос должен выглядеть примерно так: (rank должно быть рассчитано для каждого избирательного округа, следовательно partition by):

SELECT s.constituency,s.party, s.votes 
FROM  (
   SELECT constituency,
          party, 
          votes, 
          RANK() OVER (PARTITION BY constituency ORDER BY votes DESC) posn 
   FROM ge 
   WHERE yr  = 2017 ) s
WHERE s.constituency in ('S14000021', 'S14000022', 'S14000023', 
                   'S14000024', 'S14000025' 'S14000026')
and s.posn = 1
ORDER BY s.constituency,s.votes DESC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...