我有一张表'TEST'
,如下所示
Number | Seq | Name
-------+-------+------
123 | 1 | Hello
123 | 2 | Hi
123 | 3 | Greetings
234 | 1 | Goodbye
234 | 2 | Bye
我想编写一个查询,按'Number'对表进行分组,然后选择具有最大序列号(MAX(Seq))的行。查询的输出将是
Number | Seq | Name
-------+-------+------
123 | 3 | Greetings
234 | 2 | Bye
我该怎么做?
编辑:TEST
实际上是一个表,它是我已编写的长查询(连接多个表)的结果。我已经有了一个(SELECT ...
)语句来获取我需要的值。有没有办法删除重复的行(具有相同的'Number',如上所示)并只选择具有最大'Seq'值的那一行。
我在 Microsoft SQL Server 2008(SP2)
我希望通过
来实现这一目标 SELECT * FROM (SELECT ...) TEST <condition to group>
答案 0 :(得分:1)
您可以使用select win in子句
select * from test
where (number, count) in (select number, max(count) from test group by Number)
答案 1 :(得分:1)
SELECT *
FROM (SELECT test.*, MAX (seq) OVER (PARTITION BY num) max_seq
FROM test)
WHERE seq = max_seq
我从列号中更改了列名,因为您不能将保留字用于列名。这与其他答案几乎相同,只是它明确获取每个NUM的最大序列号。
答案 2 :(得分:0)
另一种选择是使用带有分区的ROW_NUMBER()
窗口With Cte As
(
Select *,
Row_Number() Over (Partition By Number Order By Count Desc) RN
From TEST
)
Select Number, Count, Name
From Cte
Where RN = 1
函数:
{{1}}
答案 3 :(得分:0)
您希望将ANALYTIC函数与条件子句一起使用,以便只获取所需的TEST行。
WITH TEST as (
...your really complex query that generates TEST...
)
SELECT
Number, Seq, Name,
RANK() OVER (PARTITION By Number ORDER BY Seq DESC) AS aRank
FROM Test
WHERE aRank = 1
;
这将返回Seq最大的每个Number分组的Number,Seq,Name。是的,它还会返回一个名为aRank的列,其中包含所有&#39; 1&#39;在它...希望它可以被忽略。
答案 4 :(得分:-1)
解决方法是仅对MAX(Seq)值进行自连接。 这个答案可以在SQL Select only rows with Max Value on a Column
找到