Количество отдельных столбцов с группировкой по нескольким столбцам

У меня есть два столбца account_number и customer_id. Один клиент может иметь несколько учетных записей, но одна учетная запись не может иметь нескольких клиентов.

Я сбросил файл, содержащий account_num и соответствующий ему customer_id, в db с помощью команды LOAD DATA INFILE. Теперь я пытаюсь проверить с помощью запроса, имеет ли какая-либо учетная запись, которая несколько раз приходила в файл, один и тот же customer_id или другой customer_id в двух разных строках.

ТРЕБОВАНИЕ: я хочу вернуть те учетные записи, которые приходили несколько раз, но с разными идентификаторами клиентов

Я пробовал с group by, но не получил желаемого результата. Это мой запрос, который не дает желаемого результата

SELECT ACCOUNT_NUM,UNIQUE_CUSTOMER_ID,COUNT(UNIQUE_CUSTOMER_ID) 
FROM LINKAGE_FILE   
GROUP BY ACCOUNT_NUM, UNIQUE_CUSTOMER_ID 
HAVING COUNT(ACCOUNT_NUM) > 1 AND COUNT(UNIQUE_CUSTOMER_ID) = 1;

Надеюсь, я ясен.

Вы хотите сказать, что учетная запись может появляться у одного и того же клиента несколько раз?

P.Salmon 20.12.2018 15:16

@ P.Salmon да может приходить несколько раз к одному и тому же клиенту, а также к другому клиенту

Muddassir Rahman 20.12.2018 15:18
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
2
57
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы можете просто получить количество уникальных идентификаторов клиентов, используя COUNT(DISTINCT..) для каждого account_num, и отфильтровать те случаи, когда количество больше 1, внутри предложения HAVING:

SELECT
  ACCOUNT_NUM, 
  COUNT(DISTINCT CUSTOMER_ID) AS unique_customer_count 
FROM LINKAGE_FILE 
GROUP BY ACCOUNT_NUM
HAVING unique_customer_count > 1

Я хочу вернуть те учетные записи, которые приходили несколько раз, но с разными идентификаторами клиентов

Muddassir Rahman 20.12.2018 15:20

Вы можете использовать EXISTS:

SELECT lf.*
FROM LINKAGE_FILE lf
WHERE EXISTS (SELECT 1 FROM LINKAGE_FILE lf1 WHERE lf1.ACCOUNT_NUM = lf.ACCOUNT_NUM AND lf1.UNIQUE_CUSTOMER_ID <> lf.UNIQUE_CUSTOMER_ID);

Однако вы также можете агрегировать с вашим запросом:

SELECT ACCOUNT_NUM, COUNT(DISTINCT UNIQUE_CUSTOMER_ID) 
FROM LINKAGE_FILE   
GROUP BY ACCOUNT_NUM
HAVING COUNT(DISTINCT UNIQUE_CUSTOMER_ID) > 1;

Таким образом, вы можете получить только ACCOUNT_NUM, у которых есть два или более CUSTOMER_ID.

Мне нужна только эта учетная запись, но этот запрос постоянно выполняется и не дает результатов.

Muddassir Rahman 20.12.2018 15:19

Я хочу вернуть те учетные записи, которые приходили несколько раз, но с разными идентификаторами клиентов

Muddassir Rahman 20.12.2018 15:21

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

Muddassir Rahman 20.12.2018 15:22

@MuddassirRahman. . Это то, что он делает и для первого запроса, который вы должны индексировать (ACCOUNT_NUM и UNIQUE_CUSTOMER_ID).

Yogesh Sharma 20.12.2018 15:25

да, это дает ACCOUNT_NUM, у которого больше 1 customer_id. но мне нужны те account_num, у которых также больше 1 customer_id, и эти customer_ids не совпадают

Muddassir Rahman 20.12.2018 15:29

Перетащите проверку клиента в запрос на соединение, например

DROP TABLE if exists t;
create table t(accountid int,cid int);
insert into t values
(1,1),(1,2).(1,1),(2,3),(3,4),(3,4);

    select distinct t.accountid,t.cid 
from t
join
(
select accountid,count(distinct cid) cids
from t
group by accountid having cids > 1 
) s on s.accountid = t.accountid;

+-----------+------+
| accountid | cid  |
+-----------+------+
|         1 |    1 |
|         1 |    2 |
+-----------+------+
2 rows in set (0.00 sec)

Другие вопросы по теме