Получить одну максимальную дату, если даты не уникальны - PullRequest
0 голосов
/ 18 апреля 2011

Для sql 2000, очень похоже на то, что я просил здесь

Получить отличную максимальную дату с помощью SQL

Но на этот раз даты не уникальны, поэтому для этогоtable pc_bsprdt_tbl

pc_bsprhd_key         pc_bsprdt_shpiadt               pc_bsprdt_prod
21ST 99-00            2001-04-30 23:59:59.000         72608-12895 
21ST 99-00            2001-04-30 23:59:59.000         72608-12910
AFCC990915            1999-09-01 00:00:00.000         72608-12115    
AFCC990915            1999-09-01 00:00:00.000         CHU99-01514
AFCC990915            1999-09-01 00:00:00.000         POP99-01514

Я бы хотел вернуть

21ST 99-00            2001-04-30 23:59:59.000
AFCC990915            1999-09-01 00:00:00.000

Теперь pc_bsprdt_prod уникален, поэтому я попробовал использовать max для такого продукта, чтобы дать мне уникальность.

Select T.pc_bsprhd_key, T.pc_bsprdt_shpiadt
From pc_bsprdt_tbl As T
    Join    (
        Select pc_bsprhd_key, Max( T1.pc_bsprdt_shpiadt ) As MaxDateTime, Max(pc_bsprdt_prod) as Product
        From pc_bsprdt_tbl As T1
        Group By T1.pc_bsprhd_key
        ) As Z
    On Z.pc_bsprhd_key = T.pc_bsprhd_key
        And Z.MaxDateTime = T.pc_bsprdt_shpiadt
    AND Z.Product = T.pc_bsprdt_prod

Кажется, что это работает:)

Есть ли способ сделать это, хотя бы просто используя дату?Может, где-то там топ-1?

Ответы [ 2 ]

3 голосов
/ 18 апреля 2011
SELECT pc_bsprhd_key, MAX(pc_bsprdt_shpiadt)
  FROM pc_bsprdt_tbl
 GROUP BY pc_bsprhd_key;
1 голос
/ 18 апреля 2011

Это может не сработать так, как вы думаете. Это даст вам МАКС (Дата) и МАКС (продукт) , которые могут быть не в одной строке . Вот пример:

    CREATE TABLE #Test
(
    a int,
    b date,
    c int,
)

INSERT INTO #Test(a, b, c)
SELECT 1, '01/01/2010', 3 UNION ALL
SELECT 1, '01/02/2010', 2 UNION ALL
SELECT 1, '01/03/2010', 1 UNION ALL
SELECT 2, '01/01/2010', 1

SELECT a, MAX(b), MAX(c) FROM #TEST
GROUP BY a

Который вернется

----------- ---------- -----------
1           2010-01-03 3
2           2010-01-01 1

Обратите внимание, что 03.01.2010 и 3 не находятся в одном ряду. В этой ситуации я не думаю, что это имеет значение для вас, но только один на один.

Что касается самого вопроса - в SQL2005 мы, вероятно, применили бы ROW_NUMBER над группами, чтобы получить строку с самой поздней датой для каждой части, однако у вас нет доступа к этой функции в 2000 году. Если вышеприведенное дает Вы исправляете результаты, я бы сказал, используйте это.

...