2013-08-21 30 views
1

我有一張有評分結果的表格。一些結果具有相同的分數。我想按照TrackingNumber對所有結果進行分組,並選擇分數最低的記錄。如果組內有平局(組內最低分數出現超過一次),我不想選擇它。這裏的T-SQL來幫助解釋:從查詢得到最好的得分結果

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 | 

有人能指出我如何做到這一點正確的方向?

+0

您可以指定你是從目前這個表查找的結果? – Shade

+1

你能用這個數據集顯示你想要的輸出嗎? – Tanner

+1

什麼意思?「如果組內有平局(組內最少分數出現超過一次),我不想選擇它」。你想完全忽略它嗎?還是你想獲得獨一無二的更高分? –

回答

1

我的查詢是有點複雜,但它的工作:

;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過濾掉所有以單一的分數記錄(因爲多分鐘,比分不被接受)。然後再次對該表進行分組以找到最低單個分數,然後再次與實際sorce表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,如果你想要的具有雙倍最小值的跟蹤數完全被忽略,do這樣的:

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