仅具有相同值的特定列的第一行

时间:2015-04-28 10:17:42

标签: sql sql-server tsql

我有一个复杂的SQL查询,返回大约10 000行。在我的查询中,我有一个OrderNr,很多行包含相同的OrderNr。现在我想只获取具有相同OrderNr的前1行。这仅适用于OrderNr列,不适用于任何其他列。我的意思是我在其他一些列中也有相同的值,但我想要所有的行。

我在这里为你做了一些简单的例子

Fiddle Example

目标也是得到输出

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

这是Firstname和我的OrderNr

相同

我该怎么做?

4 个答案:

答案 0 :(得分:7)

您可以按orderNumbers进行分区,并按ID对订单进行排名。仅选择rownumber为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

答案 1 :(得分: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

答案 2 :(得分:0)

尝试这样的事情:

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

答案 3 :(得分: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