2009-07-06 231 views
1

我想写一个查询,将只返回最新的结果。我从中提取信息的表没有唯一列,并且包含有关费率变化的信息,因此对于任何特定的客户端,可能存在多个费率变化 - 我只希望每个客户端的最新费率变化。选择最近的日期

结构为:

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

马特

+0

您能否提供一个CREATE TABLE和INSERT语句。这会容易得多。在发布像SQL这样的东西时,您应该使用代码块,以便突出显示。 – 2009-07-06 08:33:07

回答

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

group by子句具有mrrate列,以及。对于mrtk(0005)的两行,第一行的mrrate为250,第二行的mrrate为NULL。这肯定会导致两行0005.

该查询工作正常。您可以从组中删除mrrate,但可能会附加一些不明确的功能。

+0

根据结果从组中删除mrrate列: 列'mexrate.mrrate'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。 – Lima 2009-07-08 01:04:22

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

首先,row_number用于SQL 2000,所以这些都不起作用。我也不想排除NULL结果,就好像NULL结果是mrmatter AND(mrtitle或mrtk)的最新结果,然后我希望它显示。 谢谢, 马特 – Lima 2009-07-08 01:34:43