SQL 查询根据数字列对文本进行分组

SQL Query to group text based on numeric column

我有一个table'TEST'如下图

Number | Seq   | Name
-------+-------+------
123    |  1    | Hello
123    |  2    | Hi
123    |  3    | Greetings
234    |  1    | Goodbye
234    |  2    | Bye

我想编写一个查询,将 table 按 'Number' 和 select 具有最大序列号 (MAX(Seq)) 的行分组。查询的输出将是

Number | Seq   | Name
-------+-------+------
123    |  3    | Greetings
234    |  2    | Bye

我该怎么做?

编辑:TEST 实际上是一个 table,它是我已经编写的一个长查询(连接多个 table)的结果。我已经有一个 (SELECT ...) 语句来获取我需要的值。有没有办法删除重复的行(如上所示具有相同的 'Number')和 select 仅具有最大 'Seq' 值的行。 我在 Microsoft SQL Server 2008 (SP2)

我希望有一种方法可以通过

实现这一点

SELECT * FROM (SELECT ...) TEST <condition to group>

您可以使用 select win in 子句

select * from test 
where (number, count) in (select number, max(count) from test group by Number)

另一种选择是使用窗口化 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
SELECT *
  FROM (SELECT test.*, MAX (seq) OVER (PARTITION BY num) max_seq
          FROM test)
 WHERE seq = max_seq

我将列名从数字更改为因为列名不能使用保留字。这与其他答案几乎相同,除了它显式获取每个 NUM 的最大序列号。

您想将 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
;

这 returns 每个编号分组的编号、编号、名称,其中编号最大。是的,它还有一个名为 aRank 的列,其中全是“1”...希望它可以被忽略。

对此的解决方案是仅对 MAX(Seq) 值进行自连接。 这个答案可以在 SQL Select only rows with Max Value on a Column

找到