1

在源系统之前,我可以做类似下面的事情

SELECT COUNT(*)
FROM FlightDeparture FD
WHERE FD.[Response_ts] BETWEEN '2013-01-01 45:01:38.000' AND '2013-01-02 15:04:20.000'

现在我们有一个 DW,其中有一个单独的日期维度 ( Dim_Date) 和时间维度 ( Dim_time),我尝试了下面的查询,但我没有得到相同的计数

SELECT COUNT(*)
FROM FACT_FlightDeparture FD
INNER JOIN DIM_DATE DD ON FD.Resp_DATE_SK = DD.Date_Sk
INNER JOIN DIM_TIME TT ON FD.Resp_TIME_SK = TT.TIME_Sk
AND (DD.Cal_Date >= '2013-01-01' AND TT.Time_Of_Day >= '14:01:38.000')
AND (DD.Cal_Date <= '2013-01-02' AND TT.Time_Of_Day <= '14:04:20.000')

请帮忙。我已将问题减少到我如何做 TIME 部分

提前致谢

4

2 回答 2

1

AND 语句阻止了这两个谓词几乎不会返回真值。由于 Time_Of_Day 的差异,实际上每天只有不到 3 分钟的时间条件可以返回 true。

如果我的想法是正确的,您需要 1/1 上的所有时间大于或等于 14:01:38,并且 1/2 上的所有时间都小于或等于 14:04:20。

SELECT COUNT(*)
FROM FACT_FlightDeparture FD
INNER JOIN DIM_DATE DD ON FD.Resp_DATE_SK = DD.Date_Sk
INNER JOIN DIM_TIME TT ON FD.Resp_TIME_SK = TT.TIME_Sk
WHERE (
         (DD.Cal_Date = '2013-01-01' AND TT.Time_Of_Day >= '14:01:38.000')
      OR (DD.Cal_Date = '2013-01-02' AND TT.Time_Of_Day <= '14:04:20.000')
)

如果事实表很大并且您打算经常使用这种查询模式,我会将这两个列放入一个非聚集索引中。

CREATE NONCLUSTERED INDEX IX_FACT_FlightDeparture_DateTime 
ON FACT_FlightDeparture (Resp_DATE_SK,Resp_TIME_SK);

此外,如果适用,请不要忘记索引上的分区、压缩和其他选项。

于 2013-06-21T22:00:26.743 回答
0

这个问题我没有答案。你能检查 DIM_TIME 中是否存在比 FlightDeparture 更多的行吗?假设原始表 FlightDeparture 只有两条记录

'14:01:38.000','14:04:20:000'

和 DIM_TIME 有另一个,甚至重复

'14:01:38.000','14:04:19:000','14:04:20:000'
于 2013-06-21T19:49:29.253 回答