我正在尝试查询一个新创建的数据仓库,其中IsCurrent标志和生效日期位于多个表上。
我的问题是我得到重复的记录,因为 Iscurrent 标志和生效日期在我要加入的多个表上是相同的。
如何将查询编写为仅拉回一条记录而不重复?
我正在连接 2 个表,每个表中都需要一些字段,但由于当前是"1",我得到了重复
表 A
Effectivedate Expirationdate Iscurrent
2015-12-09 9999-12-31 1
表 B
Effectivedate Expirationdate Iscurrent
2015-12-09 9999-12-31 1
更新:这是一个关系数据库,没有事实和暗淡,没有星型模式。 每个表都有生效日期、到期日期和当前字段。 我正在连接 2 个表,每个表在这 3 个字段中的每个表中都有相同的记录。 我一直在探索 RN 窗口函数,想知道这是否是使用 CTE 的最佳方法?
像这样:RN = ROW_NUMBER() OVER (PARTITION BY A.EFFECTIVEDATE ORDER BY A.EFFECTIVEDATE)
我的加入是
FROM Table A
LEFT JOIN Table B ON A.ACCTNBR = B.ACCTNBR
更新 2:
我继续为此工作,以下内容对我有用,这样我就不会得到重复的记录。
Select *
From Table A
Inner Join Table B ON A.Acctnbr = B.Acctnbr
AND A.Effectivedate = '2015-12-08' and B.Effectivedate = '2015-12-08'
Where A.Acctnbr = '1234'
谢谢
您可以使用 GROUP BY 语句来消除重复项,或者如您所说,窗口函数:
SELECT * FROM
(
SELECT ROW_NUMBER() OVER (ORDER BY A.EFFECTIVEDATE) AS RN, Fiels1...
FROM TableA A
) subq
WHERE RN = 1
您可以通过 Effectivedate
和 Iscurrent
连接两个表后执行group by
。如果您有任何 where 子句,则必须将其添加到group by
子句之前。
我发布了对上述问题的更新,但我想我会更详细地回答并展示我在如何查询关系数据仓库的过程中学到的一些东西。
如果需要查询最新数据:
select * from Table A
inner join Table B on a.acctnbr = b.acctnbr
and a.iscurrent =1 and b.iscurrent =1
where a.acctnbr = '1234'
如果需要按特定日期查询:
select * from Table A
inner join Table B ON a.acctnbr = b.acctnbr
and a.effectivedate = '2015-12-08' and b.effectivedate = '2015-12-08'
where a.acctnbr = '1234'
如果需要在生效日期和到期日期之间进行查询:
select * from Table A
inner join Table B ON a.acctnbr = b.acctnbr
and '2015-12-09' between a.effectivedate and a.expirationdate
and '2015-12-09' between b.effectivedate and b.expirationdate
where a.acctnbr = '1234'
或作为:
declare @datetoquery date
set @datetoquery = '2015-12-09'
select * from Table A
inner join Table B ON a.acctnbr = b.acctnbr
and @datetoquery between a.effectivedate and a.expirationdate
and @datetoquery between b.effectivedate and b.expirationdate
where a.acctnbr = '1234'