选择最近的日期

时间:2009-07-06 08:26:06

标签: sql sql-server sql-server-2000

我正在尝试编写一个只返回最新结果的查询。我从中提取信息的表没有uniqiue列,并且包含有关速率更改的信息,因此对于任何特定客户端,可能会有多个速率更改 - 我只希望每个客户端的最新速率更改。

结构是:

mrmatter VARCHAR(14)
mrtk VARCHAR(14)
mreffdate DATETIME
mrtitle VARCHAR(100)
mrrate INT
mrdevper INT

一些示例数据是:

mrmatter         mrtk      mreffdate                  mrtitle  mrrate   mrdevper
184-00111        0005      2001-03-19 00:00:00.000    !        250      NULL
184-00111        0259      2001-03-19 00:00:00.000    !        220      NULL
184-00111        9210      2001-03-19 00:00:00.000    !        220      NULL
184-00111        0005      2007-07-01 00:00:00.000    !        NULL     NULL

从上面的数据可以看出有两个mrtk(0005),从这些结果中它应该只返回三个而不是四个行。

查询不仅仅是mrtk,而不是mrtk可能有一个mrtitle,在这种情况下我需要找到最近的日期,当有倍数时。

我尝试了以下查询,它返回从最新到最旧排序的结果,但它返回四行(两个0005)而不是仅返回三行。我尝试了不同的方法来执行相同的查询,但它们都返回相同的结果。

SELECT mrmatter,mrtk,mrrate,MAX(mreffdate) AS 'MostRecent'
FROM mexrate
WHERE mrmatter='184866-00111'
GROUP BY mrmatter,mrtk,mrrate

非常感谢能提供的任何帮助。

更新 mrrate列可以包含空值,空值可以是最新的条目。我所追求的是同一个mrmatter AND(mrtk OR mrtitle)的最新条目。

更多样本数据是:

mrmatter      mrtk               mrtk     mrrate   mreffdate
100626-01406    Senior Assoc    !   235.000 2006-01-25 00:00:00.000
100626-01406    Solicitor   !   235.000 2006-01-25 00:00:00.000
100626-01407    Associate            !  265.000 2006-01-30 00:00:00.000
100626-01407    Associate            !  276.000 2007-07-01 00:00:00.000
100626-01407    Partner          !  265.000 2006-01-30 00:00:00.000
100626-01407    Partner          !  276.000 2007-07-01 00:00:00.000
100626-01407    Senior Assoc    !   265.000 2006-01-30 00:00:00.000
100626-01407    Senior Assoc    !   276.000 2007-07-01 00:00:00.000

马特

3 个答案:

答案 0 :(得分:2)

group by子句也有mrrate列。对于两行mrtk(0005),第一行具有mrrate为250,第二行具有mrrate为NULL。这肯定会产生两排0005。

查询工作正常。您可以从组中删除mrrate,但可能附加了一些功能,但不清楚。

答案 1 :(得分:1)

通过使用此查询,我能够实现我的目标:

SELECT t1.mrmatter,t2.mrtk,t1.mrrate,t2.MostRecent
FROM mexrate t1
INNER JOIN
(
    SELECT DISTINCT(mrtk),MAX(mreffdate) AS MostRecent
    FROM mexrate
    WHERE mrmatter='184866-00111'    
    GROUP BY mrtk
) t2 ON t1.mrtk=t2.mrtk AND t1.mreffdate=t2.MostRecent
WHERE mrmatter='184866-00111' 

感谢大家对这个问题的帮助,我们一如既往地非常感谢。

马特

答案 2 :(得分:0)

试试这个:

DECLARE @YourTable table
(mrmatter VARCHAR(14)
,mrtk VARCHAR(14)
,mreffdate DATETIME
,mrtitle VARCHAR(100)
,mrrate INT
,mrdevper INT
)

insert into @YourTable values('184-00111',        '0005'     , '2001-03-19 00:00:00.000'   , '!'    ,    250   ,   NULL)
insert into @YourTable values('184-00111',        '0259'     , '2001-03-19 00:00:00.000'   , '!'    ,    220   ,   NULL)
insert into @YourTable values('184-00111',        '9210'     , '2001-03-19 00:00:00.000'   , '!'    ,    220   ,   NULL)
insert into @YourTable values('184-00111',        '0005'     , '2007-07-01 00:00:00.000'   , '!'    ,    NULL  ,   NULL)

SELECT
    mrmatter
        ,mrtk
        ,mreffdate
        ,mrtitle
        ,mrrate
        ,mrdevper
    FROM (SELECT
              row_number() over(partition by mrtk order by mrtk,mreffdate DESC) AS RankValue,*
              FROM @YourTable
         ) dt
    WHERE RankValue=1

输出:

mrmatter       mrtk           mreffdate               mrtitle  mrrate      mrdevper
-------------- -------------- ----------------------- -------- ----------- -----------
184-00111      0005           2007-07-01 00:00:00.000 !        NULL        NULL
184-00111      0259           2001-03-19 00:00:00.000 !        220         NULL
184-00111      9210           2001-03-19 00:00:00.000 !        220         NULL

(3 row(s) affected)

修改
我已经再次阅读了你的问题,而且我对你的分组要求并不是100%肯定,也许是因为样本数据有点稀疏。这可能是您的查询:

SELECT
    mrmatter
        ,mrtk
        ,mreffdate
        ,mrtitle
        ,mrrate
        ,mrdevper
    FROM (SELECT
              row_number() over(partition by mrmatter,mrtk,mrrate order by mrmatter,mrtk,mrrate,mreffdate DESC) AS RankValue,*
              FROM @YourTable
         ) dt
    WHERE RankValue=1

它会产生与查询相同的4行,因为你试图将mrrate放入组中,0005有两个:250和NULL。如果你想消除NULL使用:

SELECT
    mrmatter
        ,mrtk
        ,mreffdate
        ,mrtitle
        ,mrrate
        ,mrdevper
    FROM (SELECT
              row_number() over(partition by mrmatter,mrtk,mrrate order by mrmatter,mrtk,mrrate,mreffdate DESC) AS RankValue,*
              FROM @YourTable
              WHERE mrrate IS NOT NULL
         ) dt
    WHERE RankValue=1