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
找到
我有一个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
找到