仅检查特定行的最大日期?

时间:2014-03-05 15:35:07

标签: sql

编辑:意识到这些问题很多。尝试子查询并查看这些。

Edit2:只需要一个子查询。现在工作。为了其他任何人看到这个,我添加了

where t2.startdate = (select max(startdate) from table2 as sub 
                      where sub.item = t1.item)
and t1.effectivedate = (select max(startdate) from table2 as sub2)

我正在编写一个查询,从两个单独的表中提取两个费率,并返回两个费率之间的差异。我在获得适当的费率方面遇到了麻烦。我只需要获取每个项目的最新列表的费率。我在表格中的数据如下所示:

todate        item       rate
2014-01-15    pencil     -0.07
2014-01-17    pencil     -0.03
2014-02-22    pencil     -0.05
2014-01-15    pen        -0.013
2014-01-17    pen        -0.02
2014-02-22    pen        -0.032

我希望它返回这个(假设两个表完全相同):

Item          Rate1        Rate2         Difference        Date
Pencil        -0.05        -0.05         0                 2014-02-22
Pen           -0.032       -0.032        0                 2014-02-22

这两个表或多或少都是一样的,只是价格不同。我的问题是,无论我如何更改查询,我最终都会得到多个日期。

我现在有这个:

use db
select t1.item, t2.Rate as t2Rate, t1.Rate as t1Rate,(abs(t2.Rate) - abs(t1.Rate)) 
as Dffrnce, t2.startDate

from table2 as t2 join table1 as t1
on t2.item = t1.item
where t2.StartDate = t1.EffectiveDate
group by t1.item, t2.StartDate, t2.Rate, t1.Rate
having t2.StartDate = max(t2.StartDate)
order by t1.item

我猜我的问题源于我没有特别检查每个项目的最大日期。但我不完全确定如何做到这一点。我尝试使用distinct但返回了相同的结果。我错过了一些明显的东西吗我只想从最近的日期获取费率。我已经尝试加入项目和最大日期,声明having max(t2.StartDate) = t1.effectivedate,但似乎没有任何工作。

1 个答案:

答案 0 :(得分:1)

刚刚看到你的编辑说你搞定了。好的。

您可能会考虑使用不同的方法来标识要使用的行。

您使用的是哪种SQL?并非一切都在无处不在。

DECLARE @Rate1 AS TABLE (id INT, rateDate DATE, rate INT)
DECLARE @Rate2 AS TABLE (id INT, rateDate DATE, rate INT)

INSERT INTO @Rate1 (id, rateDate, rate) VALUES (1, '2000-01-01', 1),(1, '2001-01-01', 3),(2, '2000-01-01', 4)
INSERT INTO @Rate2 (id, rateDate, rate) VALUES (1, '2001-01-01', 2),(2, '2002-01-01', 3)

;WITH r1 AS (SELECT *, ROW_NUMBER() OVER(PARTITION BY id ORDER BY rateDate DESC) rn FROM @Rate1)
,     r2 AS (SELECT *, ROW_NUMBER() OVER(PARTITION BY id ORDER BY rateDate DESC) rn FROM @Rate2)
SELECT * 
  FROM r1 
       INNER JOIN 
       r2 ON r1.id=r2.id
WHERE r1.rn=1 
  AND r2.rn=1