SQL - группировка и подсчет строк дубликатов

0

Я не знаю, как группировать и подсчитывать строки дубликатов на mysql

ниже - результат, который я получил от моего запроса

       ssn              +       checktime           +   nama            
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++     
'196702031989031001'    +   '2018-08-03 07:33:02'   +   'FAJAR PERMADI'
'196810021993031001'    +   '2018-08-01 07:33:25'   +   'ANDRI ANGGORO, SH'
'196911052000031001'    +   '2018-08-03 07:47:22'   +   'SEMI TEDDY RORY, SS'
'196912221994032001'    +   '2018-08-01 08:03:59'   +   'AI SALATUN'
'196912221994032001'    +   '2018-08-02 09:34:11'   +   'AI SALATUN'
'196912221994032001'    +   '2018-08-03 07:33:18'   +   'AI SALATUN'
'197012051993031001'    +   '2018-08-01 07:58:47'   +   'AHMAD SODIKIN, SH'
'197012192001121001'    +   '2018-08-01 09:54:21'   +   'JUARA PAHALA MARBUN, ST'
'197012192001121001'    +   '2018-08-02 09:39:41'   +   'JUARA PAHALA MARBUN, ST'

и ниже мой запрос

SELECT a.ssn, a.checktime, b.nama
FROM hki_kepegawaian.fo_absensi a
left join hki_kepegawaian.fo_pegawai b on a.ssn = b.nip  
where (substring(cast(checktime as DATE), 6, 2) = '08') 
and (cast(a.checktime as TIME)) >= '07:30:00' and (cast(a.checktime as 
TIME)) <= '10:00:00'
and (substring(golongan, 1, 2)) NOT IN ('IV')
group by ssn, cast(a.checktime as date)

и ниже результат, который я ожидал

        ssn             +       checktime           +   nama                        +   total
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                                                                   
'196702031989031001'    +   '2018-08-03 07:33:02'   +   'FAJAR PERMADI'             +   1
'196810021993031001'    +   '2018-08-01 07:33:25'   +   'ANDRI ANGGORO, SH'         +   1
'196911052000031001'    +   '2018-08-03 07:47:22'   +   'SEMI TEDDY RORY, SS'       +   1
'196912221994032001'    +   '2018-08-01 08:03:59'   +   'AI SALATUN'                +   3
'197012051993031001'    +   '2018-08-01 07:58:47'   +   'AHMAD SODIKIN, SH'         +   1
'197012192001121001'    +   '2018-08-01 09:54:21'   +   'JUARA PAHALA MARBUN, ST'   +   2
Теги:

3 ответа

0

Я согласен с Тимом, что вы, кажется, захотите взять самое раннее время. В этом случае это выполняется group by.

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

  • Не используйте строковые операции по дате/времени.
  • Используйте значащие псевдонимы таблиц, которые являются аббревиатурами для таблицы.
  • Включите все неагрегированные столбцы в GROUP BY.
  • При необходимости используйте LIKE.

Итак, я бы предложил:

SELECT a.ssn, a.checktime, p.nama
FROM hki_kepegawaian.fo_absensi a LEFT JOIN
     hki_kepegawaian.fo_pegawai b 
     ON a.ssn = p.nip  
WHERE MONTH(checktime) = 8 AND
      CAST(a.checktime as TIME) >= '07:30:00' AND
      CAST(a.checktime as TIME)) <= '10:00:00' AND
      golongan NOT LIKE 'IV%'
GROUP BY a.ssn, p.nama;
  • 0
    привет Гордон, спасибо за ваш совет
0

Посмотрите на функцию count().

Я не могу проверить, работает ли он, но попробуйте выполнить следующий запрос:

SELECT a.ssn, a.checktime, b.nama, count(*) as total
FROM hki_kepegawaian.fo_absensi a
left join hki_kepegawaian.fo_pegawai b on a.ssn = b.nip  
where (substring(cast(checktime as DATE), 6, 2) = '08') 
and (cast(a.checktime as TIME)) >= '07:30:00' and (cast(a.checktime as 
TIME)) <= '10:00:00'
and (substring(golongan, 1, 2)) NOT IN ('IV')
group by ssn, nama
Having total>=1
0

Ожидаемый результат означает, что вы хотите сообщить о записи, имеющей самое раннее время проверки для каждой группы записей ssn/nama. Для подсчета это просто похоже на общее количество записей в каждой группе.

SELECT
    a.ssn,
    MIN(CAST(a.checktime AS date)) AS checktime,
    b.nama,
    COUNT(*) AS total
FROM hki_kepegawaian.fo_absensi a
LEFT JOIN hki_kepegawaian.fo_pegawai b
    ON a.ssn = b.nip  
WHERE
    MONTH(checktime) = 8 AND
    CAST(a.checktime AS TIME) BETWEEN '07:30:00' AND '10:00:00' AND
    SUBSTRING(golongan, 1, 2)) <> 'IV'
GROUP BY
    a.ssn, CAST(a.checktime AS date);
  • 0
    привет тим ты прав Я хочу получить самое раннее время проверки для каждого SSN. но если я использую count(*) это даст мне общее время проверки в месяц каждого SSN, а не самое раннее время проверки только SSN
  • 0
    @rafitio Использование COUNT(*) создаст ожидаемый total столбец. Если вы хотите что-то еще, обновите свои данные, чтобы показать это.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню