Захватить последнюю строку на основе столбца с повторяющимися данными? - PullRequest
1 голос
/ 17 сентября 2009

Таблица [myRecords]

     A     |     B     |     C     |     D     |     E     |     F     |
------------------------------------------------------------------------
     1     |     10    |  1/1/09   |    abc    |    aaa    |    111    |
     2     |     10    |  1/2/09   |    def    |    bbb    |    222    |
     3     |     10    |  1/3/09   |    ghi    |    ccc    |    333    |
     4     |     12    |  1/4/09   |    jkl    |    ddd    |    444    |
     5     |     12    |  1/5/09   |    mno    |    eee    |    555    |
     6     |     13    |  1/6/09   |    pqr    |    fff    |    666    |
     7     |     13    |  1/7/09   |    stu    |    ggg    |    777    |
     8     |     14    |  1/8/09   |    vwx    |    hhh    |    888    |
     9     |     14    |  1/9/09   |    yza    |    iii    |    999    |
     10    |     15    |  1/10/09  |    bcd    |    jjj    |    101    |

Результат должен быть (получение самого последнего (с) для каждого отдельного (б).

     A     |     B     |     C     |     D     |     E     |     F     |
------------------------------------------------------------------------
     3     |     10    |  1/3/09   |    ghi    |    ccc    |    333    |
     5     |     12    |  1/5/09   |    mno    |    eee    |    555    |
     7     |     13    |  1/7/09   |    stu    |    ggg    |    777    |
     9     |     14    |  1/9/09   |    yza    |    iii    |    999    |
     10    |     15    |  1/10/09  |    bcd    |    jjj    |    101    |

Ответы [ 4 ]

3 голосов
/ 17 сентября 2009
SELECT * FROM myRecords t1
 WHERE c = (SELECT max(c) FROM myRecords t2 WHERE t2.B = t1.B)
2 голосов
/ 17 сентября 2009
select t.*
from (
    select b, max(c) as maxc
    from table1
    group by b
) tm
inner join table1 t on tm.b = t.b and tm.maxc = t.c
0 голосов
/ 18 сентября 2009

Если столбец даты никогда не равен NULL, я рекомендую RANK (), если вы используете хотя бы SQL Server 2005. Управлять им гораздо проще, если вы когда-либо вносите изменения, потому что вам не нужно ничего менять в подзапросе и в основном запросе.

Для SQL Server 2005 и более поздних версий:

WITH myRecordsRanked(A,B,C,D,E,F,rk) AS (
  SELECT A,B,C,D,E,F,
    RANK() OVER (
      PARTITION BY B
      ORDER BY C DESC
    )
  FROM myRecords
)
  SELECT A,B,C,D,E,F
  FROM myRecordsRanked
  WHERE rk = 1;

Выбор значений rk = 1 даст вам связи. Используйте столбец ORDER BY разрыва связи, если вам нужна конкретная одна из связанных строк, или используйте ROW_NUMBER, если вам не нужен последовательный выбор между связями, и вы обнаружите, что стоит избегать дополнительной сортировки.

Для SQL Server 2000:

SELECT A,B,C,D,E,F
FROM myRecords
WHERE NOT EXISTS (
  SELECT * FROM myRecords as R2
  WHERE R2.B = myRecords.B
  AND R2.C > myRecords.C
)

(Это также даст вам связи на последнюю дату для значения столбца B.)

0 голосов
/ 17 сентября 2009
select t.* from table t join
(select b, max(c) as maxc from table group by b) as t2 on t.b=t2.b and t.c=t2.maxc
order by t.b
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...