为标题道歉,我不确定如何表达我的问题...... 我有一张看起来像这样的表:
A | B
--------------
01 | 1
01A | 1
01B | 1
01C | 1
02 | 1
03 | 1
03 | 2
03A | 1
03B | 1
有时A列符合字母(##A,##B
),有时则不是(##
)。我需要
SELECT A,B from Table
如果没有后缀。但是,使用后缀,我需要为每个B选择A的最大值(这个措辞很差)。我希望上表的结果如下:
A | B
--------------
01C | 1
02 | 1
03 | 2
03B | 1
现在,我正在使用子选择,我的查询是:
SELECT A,B FROM Table t1
WHERE t1.A = (SELECT MAX(t2.A) FROM Table t2WHERE LEFT(t1.A,2) = LEFT(t2.A,2)
然而,这是非常低效的,而且我的表非常大,所以他们的查询运行时间太长了。还有更好的方法吗?
谢谢!
答案 0 :(得分:2)
;with cteRowNumbers as (
select A, B, ROW_NUMBER() over(partition by B, left(A,2) order by A desc) as RowNumber
from YourTable
)
select A, B
from cteRowNumbers
where RowNumber = 1
order by A
答案 1 :(得分:0)
如果您发现公共表表达式令人不快,那么这与CTE示例基本相同。
SELECT V.*
FROM (
SELECT
A
,B
,ROW_NUMBER()OVER(PARTITION BY B,LEFT(A,2) ORDER BY A DESC) AS RowNumber
FROM YourTable
) AS V
WHERE V.RowNumber = 1