在源系统之前我可以做类似下面的事情
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部分
提前致谢
答案 0 :(得分:1)
AND语句阻止两个谓词几乎不返回true。由于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);
另外,如果适用,请不要忘记索引上的分区,压缩和其他选项。
答案 1 :(得分: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'