Sql 选择最近的日期

Sql 选择最近的日期,sql,sql-server,sql-server-2000,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

我正在尝试编写一个只返回最新结果的查询。我从中提取信息的表没有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
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
从上面的数据可以看到有两个mrtk(0005),从这些结果中,它应该只返回三行,而不是四行

查询不只是在mrtk上,而可能是在mrtk上,在这种情况下,我需要查找最近的日期,当有多个日期时

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

SELECT mrmatter,mrtk,mrrate,MAX(mreffdate) AS 'MostRecent'
FROM mexrate
WHERE mrmatter='184866-00111'
GROUP BY mrmatter,mrtk,mrrate
如能提供任何协助,将不胜感激

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

更多示例数据如下:

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
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

Matt

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

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

尝试以下操作:

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。如果要消除空值,请使用:

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

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

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' 
感谢大家在这个问题上的帮助,我们一如既往地非常感谢


Matt

请提供一个创建表和插入语句。那会容易得多。在发布SQL之类的内容时,您应该使用代码块,因此它会突出显示。从group by中删除mrrate列会导致:列“mexrate.mrrate”在select列表中无效,因为它既不包含在聚合函数中,也不包含在group by子句中。首先,行号用于SQL 2000,因此这两个列都不起作用。我也不想排除空结果,因为如果空结果是mrmatter和(mrtitle或mrtk)的最新结果,那么我希望它显示出来。谢谢,马特