Sql 选择最近的日期
我正在尝试编写一个只返回最新结果的查询。我从中提取信息的表没有uniqiue列,并且包含有关速率变化的信息,因此对于任何特定的客户端,都可能有多个速率变化-我只希望每个客户端的最新速率变化 结构如下: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
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
Mattgroup 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)的最新结果,那么我希望它显示出来。谢谢,马特