получить только уникальную запись перед группировкой - PullRequest
0 голосов
/ 11 февраля 2020

У меня есть эта таблица с именем votes, эта таблица может состоять из повторяющихся записей с этими столбцами business_id и user_id. Я создал представление, которое будет отображать количество голосов по каждой компании, но, к сожалению, подсчитаны дубликаты, чего не должно быть. Ниже мой код вида

(
    SELECT
        `v`.`business_id` AS `business_id`,
        COUNT(`v`.`vote_id`) AS `num_votes`
    FROM
        `connectn_top100`.`votes` `v`
    WHERE
        (`v`.`year` = 2019)
    GROUP BY
        `v`.`business_id`
)

Фактические данные будут

------------------------------------
id | business_id | user_id | vote_id
------------------------------------
1  | 12          |  12     | 1      
------------------------------------
2  | 12          |  12     | 1      
------------------------------------
3  | 12          |  12     | 1      
------------------------------------
4  | 13          |  15     | 1      
------------------------------------
5  | 13          |  15     | 1      
------------------------------------
6  | 12          |  16     | 1      
------------------------------------
7  | 23          |  16     | 1      
------------------------------------

, поэтому результат должен быть

------------------------------------
id | business_id | user_id | vote_id
------------------------------------
1  | 12          |  12     | 1      
------------------------------------
4  | 13          |  15     | 1      
------------------------------------
6  | 12          |  16     | 1      
------------------------------------
7  | 23          |  16     | 1      
------------------------------------

, поэтому user_id должен иметь уникальный business_id и business_id должны иметь уникальный user_id

попытался добавить еще один GROUP BY, но, похоже, ошибка.

Ответы [ 3 ]

1 голос
/ 11 февраля 2020

Если вы хотите посчитать каждый user_id только один раз на business_id, вы можете использовать count(distinct ...):

SELECT
    `v`.`business_id` AS `business_id`,
    COUNT(DISTINCT `v`.`user_id`) AS `num_votes`
FROM `connectn_top100`.`votes` `v`
WHERE `v`.`year` = 2019
GROUP BY `v`.`business_id`

Редактировать: из ваших данных выборки, похоже, что вы хотите :

SELECT
    `v`.`business_id` AS `business_id`,
    `v`.`user_id`,
    COUNT(DISTINCT `v`.`vote_id`) AS `num_votes`
FROM `connectn_top100`.`votes` `v`
WHERE `v`.`year` = 2019
GROUP BY `v`.`business_id`, `v`.`user_id`
0 голосов
/ 11 февраля 2020

Из ваших примеров данных, кажется, вам просто нужно ниже -

SELECT MIN(ID)
      ,business_id
      ,user_id
      ,vote_id
FROM `connectn_top100`.`votes` `v`
GROUP BY business_id
        ,user_id
        ,vote_id

Этот запрос сгенерирует вывод, который вы упомянули.

0 голосов
/ 11 февраля 2020

привет, вы можете попробовать этот CTE, чтобы получить ваши уникальные значения

with cte as (  SELECT 
         `v`.`business_id` AS `business_id`,
        COUNT(`v`.`vote_id`) AS `num_votes`
        ROW_NUMBER() OVER (
            PARTITION BY 
                `v`.`business_id`, 
                v`.`vote_id`                 
            ORDER BY 
              `v`.`business_id`, 
                v`.`vote_id`  
        ) row_num
     FROM 
        `connectn_top100`.`votes` `v`
    WHERE
     (`v`.`year` = 2019)
    GROUP BY
        `v`.`business_id`
        )
select * from cte 
where row_num > 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...