如果日期不唯一,则获取单个最大日期

时间:2011-04-18 15:43:16

标签: sql sql-server-2000

对于sql 2000, 与我在这里问的非常相似

Get distinct max date using SQL

但是这次日期并不是唯一的,因此对于这个表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 个答案:

答案 0 :(得分:3)

SELECT pc_bsprhd_key, MAX(pc_bsprdt_shpiadt)
  FROM pc_bsprdt_tbl
 GROUP BY pc_bsprhd_key;

答案 1 :(得分:1)

这可能不像您认为的那样有效。这将为您提供MAX(日期)和MAX(prod) ,它们可能不在同一行 。这是一个例子:

    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

请注意,1/03/2010和3不在同一行。在这种情况下,我认为这不重要,但只是抬头。

至于SQL2005中的实际问题,我们可能会对组应用ROW_NUMBER以获取每个部分的最新日期行,但是您在2000年无法访问此功能。如果上面给出了你正确的结果,我会说使用它。