Как получить максимальную строку для каждой группы значений ключа в одной таблице? - PullRequest
1 голос
/ 18 июня 2009

У меня есть таблица MSSQL 2000, в которой много повторяющихся записей. Каждая строка имеет столбец данных EffectiveChange. Я хочу получить наиболее актуальную строку, получив строку с максимальным значением (EffectiveChange) для каждого значения ключа.

Это примерные данные:

NPANXX TZONE EFFCHANGE RATE
555555 1     01/01/09   1
555555 1     05/01/09   6
214555 2     01/01/09   1
214555 2     05/01/09   3
657555 3     05/01/09   1
657555 1     01/01/09   1

Я придумал это:

SELECT DISTINCT
  NPANXX,
  TZONE,
  RATE
FROM AreaCodes
INNER JOIN (SELECT DISTINCT NPANXX, EFFCHANGE FROM AREACODES) b
  ON b.NPANXX = AreaCodes.NPANXX
GROUP BY 
  NPANXX, 
  TZONE, 
  RATE 
HAVING AreadCodes.EFFCHANGE = max(b.EFFCHANGE)

Мой вопрос заключается в том, выдаст ли мне этот запрос максимальную строку EFFCHANGE для каждого ключа (NPANXX), или он даст мне только строки, имеющие MAX (EFFCHANGE) для всей таблицы?

1 Ответ

3 голосов
/ 18 июня 2009

в одну сторону, так как вы используете 2000 в 2005 и выше, вы также можете использовать row_number ()

SELECT t1.* 
from AreaCodes t1
INNER JOIN (SELECT NPANXX, max(EFFCHANGE) as MaxDate FROM AREACODES
group by NPANXX) t2 
  ON t1.NPANXX = t2.NPANXX
and t1.EFFCHANGE = t2.MaxDate

вот полный код, включая DML и DDL

create table AreaCodes(NPANXX int,TZONE int,EFFCHANGE datetime,RATE int)

insert AreaCodes values(555555,1,'20090101',1)
insert AreaCodes values(555555,1,'20090501',6)
insert AreaCodes values(214555,2,'20090101',1)
insert AreaCodes values(214555,2,'20090501',3)
insert AreaCodes values(657555,3,'20090501',1)
insert AreaCodes values(657555,1,'20090101',1)


SELECT t1.* 
from AreaCodes t1
INNER JOIN (SELECT NPANXX, max(EFFCHANGE) as MaxDate FROM AREACODES
group by NPANXX) t2 
  ON t1.NPANXX = t2.NPANXX
and t1.EFFCHANGE = t2.MaxDate



output
657555  3   2009-05-01 00:00:00.000 1
555555  1   2009-05-01 00:00:00.000 6
214555  2   2009-05-01 00:00:00.000 3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...