我正在尝试编写一个只返回最新结果的查询。我从中提取信息的表没有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
马特
答案 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