SQL Server DW - 使用日期维度和时间维度查询数据

时间:2013-06-21 17:43:14

标签: sql sql-server date time data-warehouse

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

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部分

提前致谢

2 个答案:

答案 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'
相关问题