从SQL表中有效地选择“子maxes”

时间:2010-11-16 21:32:31

标签: sql sql-server sql-server-2005

为标题道歉,我不确定如何表达我的问题...... 我有一张看起来像这样的表:

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)

然而,这是非常低效的,而且我的表非常大,所以他们的查询运行时间太长了。还有更好的方法吗?

谢谢!

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
相关问题