2013-08-21 2 views
1

나는 득점 결과를 기록한 테이블을 가지고 있습니다. 결과 중 일부는 동일한 점수를가집니다. 모든 결과를 TrackingNumber로 그룹화하고 가장 낮은 점수를 가진 레코드를 선택하고 싶습니다. 그룹 내에 동점이있는 경우 (그룹의 최소 점수가 두 번 이상 발생 함) 선택하고 싶지 않습니다.쿼리에서 가장 좋은 결과를 얻으십시오

CREATE TABLE Dupe 
(
    Id  INT NOT NULL IDENTITY(1, 1) PRIMARY KEY, 
    TrackingNumber INT NOT NULL, 
    Name VARCHAR(50), 
    Score INT NOT NULL 
) 
GO 

INSERT INTO dbo.Dupe (TrackingNumber, Name, Score)VALUES (1, 'Name1', 1) 
INSERT INTO dbo.Dupe (TrackingNumber, Name, Score)VALUES (1, 'Name1', 3) 
INSERT INTO dbo.Dupe (TrackingNumber, Name, Score)VALUES (1, 'Name1', 3) 
INSERT INTO dbo.Dupe (TrackingNumber, Name, Score)VALUES (1, 'Name1', 5) 
INSERT INTO dbo.Dupe (TrackingNumber, Name, Score)VALUES (2, 'Name2', 1) 
INSERT INTO dbo.Dupe (TrackingNumber, Name, Score)VALUES (2, 'Name2', 4) 
INSERT INTO dbo.Dupe (TrackingNumber, Name, Score)VALUES (2, 'Name2', 9) 
INSERT INTO dbo.Dupe (TrackingNumber, Name, Score)VALUES (4, 'Name4', 11) 
INSERT INTO dbo.Dupe (TrackingNumber, Name, Score)VALUES (4, 'Name4', -55) 
INSERT INTO dbo.Dupe (TrackingNumber, Name, Score)VALUES (4, 'Name4', -55) 

원하는 출력 :

| ID | TRACKINGNUMBER | NAME | SCORE | 
--------------------------------------- 
| 1 |    1 | Name1 |  1 | 
| 4 |    2 | Name2 |  1 | 

누군가가이 작업을 수행하는 방법에 대한 올바른 방향으로 날 지점 수를 여기에 도움이되는 TSQL 설명입니까? (여러 분-점수가 인정되지 않기 때문에)

;WITH tmp (tn, sc) AS 
(
    SELECT TrackingNumber, score 
    FROM dupe 
    GROUP BY TrackingNumber, score 
    HAVING COUNT(*) = 1 
) 
SELECT dupe.* 
FROM dupe 
INNER JOIN (
    SELECT tn , MIN(sc) AS s 
    FROM tmp 
    GROUP BY tn 
) t2 ON tn = trackingnumber AND s = score 

CTE에 tmp는 하나의 점수가 모든 레코드를 필터링 :

+0

당신이 현재 테이블에서 찾고있는 결과를 지정할 수 있습니다 얻을? – Shade

+1

이 데이터 세트로 원하는 출력을 표시 할 수 있습니까? – Tanner

+1

"그룹에 넥타이가있는 경우 (그룹의 최소 점수가 두 번 이상 나타남) 선택하고 싶지 않습니다"라는 의미는 무엇입니까? 이것을 완전히 무시하고 싶습니까? 아니면 다음으로 높은 점수를 얻고 싶습니까? –

답변

1

내 쿼리는 조금 더 복잡하지만 일을한다. 그런 다음이 테이블을 다시 그룹화하여 최소 단일 스코어를 찾은 다음 실제 술 테이블 dupe과 다시 결합하여 모든 열을 출력합니다.

http://sqlfiddle.com/#!6/eadec/5

당신은 또한 (다만 파생 테이블) CTE없이 쓸 수 있습니다 :

SELECT dupe.* FROM dupe 
INNER JOIN 
(SELECT tn,min(sc) s FROM 
    (SELECT TrackingNumber tn, score sc FROM dupe 
    GROUP BY TrackingNumber, score HAVING COUNT(*)=1 
    ) tmp GROUP BY tn 
) t2 
ON tn=trackingnumber AND s=score 

http://sqlfiddle.com/#!6/eadec/6

출력 :

| ID | TRACKINGNUMBER | NAME | SCORE | 
--------------------------------------- 
| 1 |    1 | Name1 |  1 | 
| 4 |    2 | Name2 |  1 | 
| 7 |    4 | Name4 | 11 | 

OK, 당신이 원하는 경우 double min 값이 완전히 무시 된 추적 번호는 이 :

SELECT dupe.* FROM dupe INNER JOIN 
(SELECT tn, s FROM dupe INNER JOIN 
    (SELECT trackingnumber tn,min(score) s FROM dupe 
    GROUP BY trackingnumber) t1 
ON trackingnumber=tn AND score=s 
GROUP BY tn,s HAVING COUNT(*)=1 
) t2 ON trackingnumber=tn AND score=s 

이이

| ID | TRACKINGNUMBER | NAME | SCORE | 
--------------------------------------- 
| 1 |    1 | Name1 |  1 | 
| 4 |    2 | Name2 |  1 | 

http://sqlfiddle.com/#!6/eadec/11

+0

모든 작업에 감사드립니다! TrackingNumber 4가 반환되지 않도록 쿼리를 조정할 수있는 방법이 있습니까? 그룹 내에 동점이있는 경우 해당 그룹에 대해 반환 된 결과가 반환되기를 원하지 않습니다. – mwhib

관련 문제