2015-04-28 270 views
1

我有一個複雜的SQL查詢返回大約10 000行。在我的查詢中,我有一個OrderNr並且很多行包含相同的OrderNr。現在我想只抓取具有相同OrderNr的第一行。這僅適用於OrderNr列,不適用於其他列。我的意思是我在其他一些列也有相同的值,但在那裏我想要所有的行。只有具有相同值的特定列的第一行

在這裏,我做了一些簡單的例子給你

Fiddle Example

進球太得到的輸出

1,Bruno,Dan 
2,Johnson,Lars 
4,Jordan, Derreck 
5,Johnson,Peter 

這裏是名字相同,我OrderNr

我該怎麼辦這個?

+1

你必須使用'DISTINCT'並用'ORDER BY'指定順序來告訴數據庫你想返回哪一行。 –

+1

@ConsiderMe我很想看看這是如何完成的。我懷疑這是可能的,請證明我錯了 –

+0

@ t-clausen.dk它似乎這是不可能使用SQL Server。太糟糕了,它不支持'DISTINCT ON'。 –

回答

2
;WITH CTE as 
(
    SELECT PersonID, LastName, FirstName, 
    row_number() over (partition by Firstname order by PersonID) rn 
    FROM Persons 
) 
SELECT PersonID, LastName, FirstName 
FROM CTE 
WHERE rn = 1 
0

嘗試是這樣的:

SELECT * FROM Persons p1 
where p1.PersonID = (select min(PersonID) from persons p2 where p2.firstname=p1.firstname) 
7

您可以通過orderNumbers IDS分區和排名順序。當只選擇行數爲1的行時,您會得到預期的結果。

;WITH orders AS (
    SELECT *, 
     Row_Number() over (PARTITION BY OrderNr ORDER BY <ID>) rn  
    FROM T 
) 
SELECT * FROM orders WHERE rn=1 

有了您的提琴:http://sqlfiddle.com/#!6/07780/11

+0

非常感謝你,完美的解決方案! – user2210516

0

你可以實現使用兩個步驟,預期的結果,而不CTEsWINDOW FUNCTIONs

第一步:GROUP你行通過FirstName並選擇他們每個人的最低PersonID

第二步:使用self-join獲得LastName值,我們將在步驟:第一,最低PersonId

SELECT foo.PersonID, b.LastName, foo.FirstName 
FROM(
    SELECT 
    MIN(PersonID) AS PersonID, 
    FirstName 
    FROM Persons 
    GROUP BY FirstName 
) foo 
    INNER JOIN Persons b ON foo.PersonID = b.PersonID 
+0

@ughai感謝您的評論。答案已編輯:) –

相關問題