SQL-запрос для поиска записей, где count> 1
У меня есть таблица с именем PAYMENT
. Внутри этой таблицы у меня есть идентификатор пользователя, номер учетной записи, почтовый индекс и дата. Я хотел бы найти все записи для всех пользователей, которые имеют более одного платежа в день с тем же номером учетной записи.
UPDATE: Кроме того, должен быть фильтр, а не только записи, чей почтовый индекс отличается.
Вот как выглядит таблица:
| user_id | account_no | zip | date |
| 1 | 123 | 55555 | 12-DEC-09 |
| 1 | 123 | 66666 | 12-DEC-09 |
| 1 | 123 | 55555 | 13-DEC-09 |
| 2 | 456 | 77777 | 14-DEC-09 |
| 2 | 456 | 77777 | 14-DEC-09 |
| 2 | 789 | 77777 | 14-DEC-09 |
| 2 | 789 | 77777 | 14-DEC-09 |
Результат должен выглядеть примерно так:
| user_id | count |
| 1 | 2 |
Как бы вы выразили это в SQL-запросе? Я думал о себе, но почему-то мой счет ошибочен.
Ответы
Ответ 1
Используйте предложение HAVING и GROUP Поля, которые делают уникальную строку
Ниже вы найдете
всех пользователей, которые имеют более одного платежа в день с тем же номером учетной записи
SELECT
user_id ,
COUNT(*) count
FROM
PAYMENT
GROUP BY
account,
user_id ,
date
Having
COUNT(*) > 1
Обновление
Если вы хотите включать только те, у которых есть отдельный ZIP, вы можете сначала получить отличный набор, а затем выполнить команду HAVING/GROUP BY
SELECT
user_id,
account_no ,
date,
COUNT(*)
FROM
(SELECT DISTINCT
user_id,
account_no ,
zip,
date
FROM
payment
)
payment
GROUP BY
user_id,
account_no ,
date
HAVING COUNT(*) > 1
Ответ 2
Попробуйте этот запрос:
SELECT column_name
FROM table_name
GROUP BY column_name
HAVING COUNT(column_name) = 1;
Ответ 3
create table payment(
user_id int(11),
account int(11) not null,
zip int(11) not null,
dt date not null
);
insert into payment values
(1,123,55555,'2009-12-12'),
(1,123,66666,'2009-12-12'),
(1,123,77777,'2009-12-13'),
(2,456,77777,'2009-12-14'),
(2,456,77777,'2009-12-14'),
(2,789,77777,'2009-12-14'),
(2,789,77777,'2009-12-14');
select foo.user_id, foo.cnt from
(select user_id,count(account) as cnt, dt from payment group by account, dt) foo
where foo.cnt > 1;
Ответ 4
Я бы не рекомендовал ключевое слово HAVING
для новичков, это в основном для устаревших целей.
Я не понимаю, что является ключом для этой таблицы (это полностью нормализованный, интересно?), следовательно, мне сложно следовать вашим требованиям:
Я хотел бы найти все записи для всех пользователей, которые имеют более одного оплата в день с тем же номером счета... Кроме того, там должен быть фильтром, чем только подсчет записей, почтовый индекс которых отличается.
Итак, я взял буквальную интерпретацию.
Ниже приведено более подробное, но может быть проще понять и, следовательно, поддерживать (я использовал CTE для таблицы PAYMENT_TALLIES
, но это может быть VIEW
:
WITH PAYMENT_TALLIES (user_id, zip, tally)
AS
(
SELECT user_id, zip, COUNT(*) AS tally
FROM PAYMENT
GROUP
BY user_id, zip
)
SELECT DISTINCT *
FROM PAYMENT AS P
WHERE EXISTS (
SELECT *
FROM PAYMENT_TALLIES AS PT
WHERE P.user_id = PT.user_id
AND PT.tally > 1
);
Ответ 5
delete t1 from @tbl t1 where 1<(select count(ID) from @tbl where ID=t1.ID)