2010-11-16 3 views
1

Извинения за титул, я не уверен, как выразить свою проблему ... У меня есть таблица, которая выглядит примерно так:эффективно выбрать «суб» из максимумы SQL таблицы

A  | B 
-------------- 
01 | 1 
01A | 1 
01B | 1 
01C | 1 
02 | 1 
03 | 1 
03 | 2 
03A | 1 
03B | 1 

Иногда колонок А является квалифицируется письмом (##A,##B), иногда это не (##). Мне понадобится

SELECT A,B from Table 

если суффиксов не было. Однако с суффиксом мне нужно выбрать максимальное значение A для каждого B. (Это было сформулировано плохо). Я хотел бы ожидать следующие результаты для приведенных выше таблиц:

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

какая система баз данных? –

+0

SQL Server (2005) – nosirrahcd

+0

Не будет эффективного способа выполнить строковый поиск для последней части строки, а затем выполнить некоторую логику на основе этого. SQL не предназначен для таких функций. – JNK

ответ

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 
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 
Смежные вопросы