Sql server TSQL如何使用IsCurrent标志查询数据仓库

Sql server TSQL如何使用IsCurrent标志查询数据仓库,sql-server,tsql,data-warehouse,Sql Server,Tsql,Data Warehouse,我试图查询一个新创建的数据仓库,其中IsCurrent标志和effectivedate位于多个表上 我的问题是,我得到了重复的记录,因为我要加入的多个表上的Iscurrent标志和effectivedate是相同的 如何编写查询以只提取一条记录而不提取重复的记录 我正在连接这两个表,每个表中都需要一些字段,但是由于iscurrent是'1',我得到了重复的字段 表A 表B 更新: 这是一个关系数据库,没有事实和DIM,没有星型模式。每个表都有effectivedate、expirationdat

我试图查询一个新创建的数据仓库,其中IsCurrent标志和effectivedate位于多个表上

我的问题是,我得到了重复的记录,因为我要加入的多个表上的Iscurrent标志和effectivedate是相同的

如何编写查询以只提取一条记录而不提取重复的记录

我正在连接这两个表,每个表中都需要一些字段,但是由于iscurrent是'1',我得到了重复的字段

表A

表B

更新: 这是一个关系数据库,没有事实和DIM,没有星型模式。每个表都有effectivedate、expirationdate和iscurrent字段。我连接了两个表,每个表在这3个字段中都有相同的记录。我一直在探索RN窗口函数,想知道这是否是使用CTE的最佳方法

类似于:RN=按A.EFFECTIVEDATE划分的行数按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'

谢谢,

您可以在按Effectivedate和Iscurrent连接两个表之后进行分组。如果有where子句,则必须将其添加到group by子句之前。

您可以使用group by语句消除重复项,或者如您所说,使用窗口函数:

SELECT * FROM 
(
    SELECT ROW_NUMBER() OVER (ORDER BY A.EFFECTIVEDATE) AS RN, Fiels1...
    FROM TableA A
) subq
WHERE RN = 1

我发布了对上述问题的更新,但我想我会更详细地回答,并展示我在如何查询关系数据仓库的过程中学到的一些东西

如果需要查询最新的数据:

如果需要按特定日期查询:

如果需要查询生效日期和到期日期:

或作为:


你还没有向我们解释你的加入。通常,在数据仓库中,您可以在事实和维度之间连接。你到底在干什么?请至少发布导致重复的查询。编辑我的问题,并在我完成此过程时发布我发现的答案。感谢您为我指明了正确的方向。我将尝试行数窗口功能。这在过去对我很有效。
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 
(
    SELECT ROW_NUMBER() OVER (ORDER BY A.EFFECTIVEDATE) AS RN, Fiels1...
    FROM TableA A
) subq
WHERE RN = 1
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'