【问题标题】:Joining date with datetime and values per day加入日期与日期时间和每天的值
【发布时间】:2018-06-25 05:30:12
【问题描述】:

我正在编写一个查询,以便填写我的事实表。我有一张记录每天(日期)23:59:00 每天的天气平均值的表格。 我有另一个表格,其中记录了不同房间的气候控制数据,每分钟(日期时间)。 而且我在另一个数据库中也有一个可用的时间维度。

我想用所有可用的 timeKeys 以及来自我的气候控制表和我的天气表的所有数据来填充我的事实表。

对不起,我的英语不是我的母语。

所以,为了找到与日期值匹配的 timeKey,我编写了这个查询:

SELECT  t.timeKey AS WeathertimeKey, 
        weather.date AS date,
        weather.temperature,
        weather.rainAmountMM,
        weather.windDirection,
        weather.windSpeed
FROM    StarSchema.dbo.timeDim t, weather 
WHERE   DATEPART(mm, t.DATE) = DATEPART(mm, weather.date)
        AND DATEPART(dd, t.DATE) = DATEPART(dd, weather.date)
        AND DATEPART(Hour, t.DATE) = '23'
        AND DATEPART(MINUTE, t.DATE) = '59'

结果:Result

我的时间维度在 2015 年的每一分钟都有一个 timeKey:timeDimension

我要填写的事实表:facttable

我填充事实表的解决方案是每天创建一个具有相应 timeKey 的视图,然后在我的主查询中加入该视图。

SELECT 
        t.timeKey as timeKey, 
        rt1.roomId AS roomKey,
        1 AS roomDataKey,
        1 AS usageKey,
        1 AS knmiKey,
        rt1.temperature AS temperature,
        rt1.locWindow AS locWindow,
        rt1.locDoor AS locDoor,
        rh1.turnedOn AS turnedOn,
        rh1.temperature AS temperatureHeater,
        s.storyTemp AS storyTemp,
        s.storyHumidity AS storyHumidity,
        vw.temperature AS temperatureOutside,
        vw.rainAmountMM AS rainAmountMM,
        vw.windSpeed AS windSpeed,
        vw.windDirection AS windDirection,
        vu.gasM3 AS gasM3,
        vu.electricityKWH AS electricityKWH
FROM    StarSchema.dbo.timeDim t
        INNER JOIN roomTemperature1 rt1 ON rt1.date = t.DATE
        INNER JOIN roomHeating1 rh1 ON rt1.date = rh1.date
        INNER JOIN story s ON s.date = rt1.date
        INNER JOIN  vw_timeKeyWeatherDay vw ON t.timeKey = vw.WeathertimeKey
        INNER JOIN vw_timeKeyUsageDay vu ON t.timeKey = vu.UsagetimeKey

结果如下:result2

所以现在它只使用每天 23:59 的 timeKey。 我想要在那里度过完整的日子,但我该怎么做呢?

有人可以帮帮我吗? 我再次为我使用英语而道歉。 我尽力了:-)

【问题讨论】:

  • 听起来是个坏主意。您正在尝试使用具有不同含义的两组数据填充单个事实表。您的天气表有每日平均温度,而您的气候表有实际温度..
  • 那你有什么建议?为天气创建维度?
  • 不了解您的业务需求,无法提出建议。

标签: sql tsql join view etl


【解决方案1】:

如果我了解您的问题属性,您希望匹配两个具有不同精度级别的日期列:一个是每分钟,另一个是每天。我建议的是一个只为两者存储 yyyy.mm.dd 的查询。然后,当您加入时,您每次都会获得匹配的记录。

您可以通过在 SQL Server 中添加每个日期与日期 0 之间的距离来做到这一点

DECLARE @DVal DATE
DECLARE @DTVal DATETIME 
SET @DVal = '2018-01-18'
SET @DTVal = '2018-01-18 12:02:01.003' 

SELECT @DVal
SELECT @DTVal 

SELECT DATEDIFF(D,0,@DTVal) 
SELECT DATEDIFF(D,0,@DVal)

SELECT DATEADD(D,(DATEDIFF(D,0,@DTVal) ),0)
SELECT DATEADD(D,(DATEDIFF(D,0,@DVal) ),0) 

对以上代码的评论: 首先,我声明变量,一个 DATE 和一个 DATETIME,然后我给它们稍微不同的值,小于一天。 然后我选择它们,以便我们可以看到它们是不同的

2018-01-18
2018-01-18 12:02:01.003

然后我选择每个日期和0之间的天数差,我们的天数相同

43116
43116

然后我将此差异添加到日期 0,我们最终得到两个相同的日期时间值

2018-01-18 00:00:00.000
2018-01-18 00:00:00.000

我希望我已经回答了你的问题。如果我没有,请评论我的答案。至少这是一个起点。如果您的目标是获得每天的完整分钟范围,您可以创建两个计算列,一个基于当前日期,另一个基于当前日期 +1 天,并使用 BETWEEEN ON 子句加入时间表等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-05
    • 1970-01-01
    • 1970-01-01
    • 2013-07-31
    • 2018-05-04
    • 1970-01-01
    相关资源
    最近更新 更多