我有一个复杂的SQL查询,返回大约10 000行。在我的查询中,我有一个OrderNr,很多行包含相同的OrderNr。现在我想只获取具有相同OrderNr的前1行。这仅适用于OrderNr列,不适用于任何其他列。我的意思是我在其他一些列中也有相同的值,但我想要所有的行。
我在这里为你做了一些简单的例子
目标也是得到输出
1,Bruno,Dan
2,Johnson,Lars
4,Jordan, Derreck
5,Johnson,Peter
这是Firstname和我的OrderNr
相同我该怎么做?
答案 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
答案 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)
您可以使用两个步骤实现预期结果,而不是CTEs
和WINDOW 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