2015-04-28 216 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感谢您的评论。答案已编辑:) –

相关问题