Как добавить номер строки в отображение MySQL с помощью ROW_NUMBER () - PullRequest
0 голосов
/ 11 июня 2019

Как я могу использовать функцию ROW_NUMBER () (обязательно) для отображения номеров строк на дисплее таблицы Mysql?

mysql> select * from work;
+------+-----------+
| name | work_days |
+------+-----------+
| john |         5 |
| jane |         7 |
| jane |         2 |
| john |         3 |
+------+-----------+
4 rows in set (0.01 sec)

Без использования ROW_NUMBER ():

mysql> SELECT name, 
    -> AVG(work_days) AS workday_average, 
    -> COUNT(*) as count
    -> FROM work
    -> GROUP BY name
    -> HAVING workday_average > 2
    -> ORDER BY workday_average ASC, count DESC;
+------+-----------------+-------+
| name | workday_average | count |
+------+-----------------+-------+
| john |          4.0000 |     2 |
| jane |          4.5000 |     2 |
+------+-----------------+-------+
2 rows in set (0.00 sec)

Ниже приведены ошибки при попытке добавить столбец с номером строки с помощью ROW_NUMBER ().

mysql> SELECT name, 
    -> ROW_NUMBER() over(PARTITION BY name ORDER BY work_days) as row_num,
    -> AVG(work_days) AS workday_average, 
    -> COUNT(*) as count
    -> FROM work
    -> GROUP BY name
    -> HAVING workday_average > 2
    -> ORDER BY workday_average ASC, count DESC;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '(PARTITION BY name ORDER BY work_days) as row_num,
AVG(work_days) AS workday_ave' at line 2
mysql> 

1 Ответ

1 голос
/ 11 июня 2019

Оконные функции вычисляются после агрегации GROUP BY, поэтому не имеет смысла использовать раздел на name, так как каждая запись в этой точке будет гарантированно иметь отдельное имя. Скорее всего, вы хотите что-то вроде этого:

SELECT
    name, 
    ROW_NUMBER() OVER (ORDER BY AVG(work_days), COUNT(*) DESC) AS row_num,
    AVG(work_days) AS workday_average, 
    COUNT(*) AS count
FROM work
GROUP BY
    name
HAVING
   workday_average > 2
ORDER BY
    workday_average,
    count DESC;

Но это, конечно, предполагает, что вы используете MySQL 8+. Если нет, то ROW_NUMBER будет недоступно.

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