그래서 아래의 SQL 코드와 같은 작업을하고 싶습니다.
select s.id, s.name,s.city
from stuff s
group by s.name having count(where city and name are identical) > 1
다음을 생성하려면 (그러나 이름 만 또는 도시 만 일치하는 경우 무시하고 두 열 모두에 있어야 함) :
id name city
904834 jim London
904835 jim London
90145 Fred Paris
90132 Fred Paris
90133 Fred Paris
답변
id
쌍에 대해 복제 됨 name
및 city
:
select s.id, t.*
from [stuff] s
join (
select name, city, count(*) as qty
from [stuff]
group by name, city
having count(*) > 1
) t on s.name = t.name and s.city = t.city
답변
SELECT name, city, count(*) as qty
FROM stuff
GROUP BY name, city HAVING count(*)> 1
답변
이와 같은 것이 트릭을 할 것입니다. 성능에 대해 모르기 때문에 몇 가지 테스트를 수행하십시오.
select
id, name, city
from
[stuff] s
where
1 < (select count(*) from [stuff] i where i.city = s.city and i.name = s.name)
답변
를 사용하면 count(*) over(partition by...)
원치 않는 반복을 찾을 수있는 간단하고 효율적인 방법을 제공하는 동시에 영향을받는 모든 행과 원하는 열을 모두 나열합니다.
SELECT
t.*
FROM (
SELECT
s.*
, COUNT(*) OVER (PARTITION BY s.name, s.city) AS qty
FROM stuff s
) t
WHERE t.qty > 1
ORDER BY t.name, t.city
최신 RDBMS 버전은 count(*) over(partition by...)
MySQL V 8.0을 지원하지만 아래와 같이 “창 기능”을 도입했습니다 (MySQL 8.0).
CREATE TABLE stuff( id INTEGER NOT NULL ,name VARCHAR(60) NOT NULL ,city VARCHAR(60) NOT NULL );
INSERT INTO stuff(id,name,city) VALUES (904834,'jim','London') , (904835,'jim','London') , (90145,'Fred','Paris') , (90132,'Fred','Paris') , (90133,'Fred','Paris') , (923457,'Barney','New York') # not expected in result ;
SELECT t.* FROM ( SELECT s.* , COUNT(*) OVER (PARTITION BY s.name, s.city) AS qty FROM stuff s ) t WHERE t.qty > 1 ORDER BY t.name, t.city
아이디 | 이름 | 도시 | 수량 ----- : | : --- | : ----- | -: 90145 | 프레드 | 파리 | 삼 90132 | 프레드 | 파리 | 삼 90133 | 프레드 | 파리 | 삼 904834 | 짐 | 런던 | 2 904835 | 짐 | 런던 | 2
db <> 여기 바이올린
창 기능. MySQL은 이제 쿼리의 각 행에 대해 해당 행과 관련된 행을 사용하여 계산을 수행하는 창 함수를 지원합니다. 여기에는 RANK (), LAG () 및 NTILE ()과 같은 함수가 포함됩니다. 또한 여러 기존 집계 함수를 이제 창 함수로 사용할 수 있습니다. 예를 들어, SUM () 및 AVG (). 자세한 내용은 Section 12.21,“창 기능”을 참조하십시오 .
답변
이 게시물에서 게임에 조금 늦었지만이 방법이 매우 유연하고 효율적이라는 것을 알았습니다.
select
s1.id
,s1.name
,s1.city
from
stuff s1
,stuff s2
Where
s1.id <> s2.id
and s1.name = s2.name
and s1.city = s2.city
답변
스스로 물건에 가입하고 이름과 도시를 일치시켜야합니다. 그런 다음 개수별로 그룹화합니다.
select
s.id, s.name, s.city
from stuff s join stuff p ON (
s.name = p.city OR s.city = p.name
)
group by s.name having count(s.name) > 1
답변
70 개의 열이 있고 중복을 나타내는 4 개의 스테이징 테이블이있는 경우이 코드는 문제가되는 열을 반환합니다.
SELECT
COUNT(*)
,LTRIM(RTRIM(S.TransactionDate))
,LTRIM(RTRIM(S.TransactionTime))
,LTRIM(RTRIM(S.TransactionTicketNumber))
,LTRIM(RTRIM(GrossCost))
FROM Staging.dbo.Stage S
GROUP BY
LTRIM(RTRIM(S.TransactionDate))
,LTRIM(RTRIM(S.TransactionTime))
,LTRIM(RTRIM(S.TransactionTicketNumber))
,LTRIM(RTRIM(GrossCost))
HAVING COUNT(*) > 1
.
