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

TSQL How to query a Data Warehouse with the IsCurrent Flag

我正在尝试查询一个新创建的数据仓库,其中 IsCurrent 标志和生效日期在多个 table 上。

我的问题是我得到了重复的记录,因为 Iscurrent 标志和有效日期在我加入的多个 table 上是相同的。

如何写查询只拉回一条记录不重复?

我加入了 2 个 table,每个 table 都需要一些字段,但由于 iscurrent 是“1”,我得到了重复项

Table一个

Effectivedate   Expirationdate  Iscurrent

2015-12-09      9999-12-31        1

TableB

Effectivedate  Expirationdate  Iscurrent
2015-12-09       9999-12-31       1

更新: 这是一个关系数据库,没有事实和数据,没有星型模式。每个 table 都有 effectivedate、expirationdate 和 iscurrent 字段。我加入了 2 tables,并且每个人在这 3 个字段中都有相同的记录。我一直在探索 RN window 函数,想知道这是否是使用 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

更新二:

我继续处理这个问题,下面的内容对我有用,这样我就不会得到重复的记录。

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'

谢谢,

您可以在通过 EffectivedateIscurrent 连接两个表后执行 group by。如果您有任何 where 子句,则必须将其添加到 group by 子句之前。

您可以使用 GROUP BY 语句来消除重复项,或者如您所说,window 函数:

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'