ErrorMadness Ответов: 1

Как я могу подсчитать строки с вхождениями одного типа?


Например, я хочу подсчитать количество вхождений типа entrytype идентификатора сотрудника в день.
1 для первого входа, 2 для второго входа и так далее.
Можете ли вы помочь мне в том, как я могу сделать это в sql 5.7?

entrytype      id  entrydate   entry_count  
---------  ------  ----------  ---------
IN             16  2018-04-16          1
OUT            16  2018-04-16          1
IN             16  2018-04-16          2
OUT            16  2018-04-16          2
IN             27  2018-04-16          1
OUT            27  2018-04-16          1
IN             27  2018-04-16          2
OUT            27  2018-04-16          2
IN             29  2018-04-16          1
OUT            29  2018-04-16          1
IN             29  2018-04-16          2
OUT            29  2018-04-16          2


Что я уже пробовал:

SELECT entrytype, id, entrydate , COUNT(1) AS row_num FROM employeename2 GROUP BY id, entrytime ORDER BY entrydate,id;


Но это показывает

entrytype      id  entrydate   entry_count  
---------  ------  ----------  ---------
IN             16  2018-04-16          1
OUT            16  2018-04-16          1
IN             16  2018-04-16          1
OUT            16  2018-04-16          1
IN             27  2018-04-16          1
OUT            27  2018-04-16          1
IN             27  2018-04-16          1
OUT            27  2018-04-16          1
IN             29  2018-04-16          1
OUT            29  2018-04-16          1
IN             29  2018-04-16          1
OUT            29  2018-04-16          1

CHill60

Попробуйте группировать по EntryDate вместо EntryTime

1 Ответов

Рейтинг:
2

CHill60

Похоже, вам действительно нужен номер строки для каждой записи разделенный с помощью параметра entrytype, которые могут, идентификатор сотрудника и записьдата (не время входа).

Это тривиально в MSSQL, но не так много в MySQL. Концепция, которую вы ищете, - это "оконные" функции.

Это документация MySQL по ним MySQL :: MySQL 8.0 справочное руководство :: 12.20.2 концепции и синтаксис оконных функций[^]

А вот проработанный пример от Кеннета Сюя Запрограммируйте его: аналитическая функция в MySQL - ROW_NUMBER, RANK, DENSE_RANK[^]

Если это поможет, то MSSQL-эквивалент того, что вы пытаетесь сделать, - это

SELECT entrytype, id, entrydate , ROW_NUMBER() OVER (PARTITION BY id, entrytype, entrydate ORDER BY entrydate, id) FROM employeename2 
Еще несколько моментов:
- Ваш стол employeename2 является нет хранение имен сотрудников - это хранение записей посещаемости, и они должны быть названы соответствующим образом. Подходящими именами будут все, что не вводит в заблуждение, например employeeAttendance, InOutRecord, XY0002349. (Последнее имя не является хорошим именем без словаря, но, по крайней мере, оно не вводит в заблуждение).
- Колонка id на вашем столе тоже непонятно - это на самом деле то же самое. идентификатор сотрудника и нет этот стол запись идентификатор.
- Ваша попытка в SQL использует столбец entrytime но вы не показали нам никаких данных для этого. Если это была просто опечатка, то вам действительно нужен столбец, содержащий время, но нет необходимости разделять дату и время на отдельные столбцы


ErrorMadness

ROW_NUMBER() и OVER() никогда не работают с более низкими версиями MySQL, я использую MySQL 5.7. но в любом случае спасибо за советы и ответ Chill60. :)

CHill60

"ROW_NUMBER() и OVER() никогда не работают с более низкими версиями MySQL" ... да, я знаю, именно поэтому 2-я ссылка, которую я предоставил, показывает, как получить тот же результат в MySQL, используя переменные и подзапросы.
Я должен был пояснить, что первое звено было просто объяснить концепцию.