编辑:意识到这些问题很多。尝试子查询并查看这些。
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
,但似乎没有任何工作。
答案 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