SQL Query基于数字列对文本进行分组

时间:2016-09-22 19:26:43

标签: sql sql-server greatest-n-per-group

我有一张表'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>

5 个答案:

答案 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

找到