【问题标题】:MySQL: JOIN these two tables and fill missing values with the most recent onesMySQL:加入这两个表并用最近的表填充缺失值
【发布时间】:2017-02-09 18:07:11
【问题描述】:

我有下表months

date (date)
-----------
2016-11-01
2017-12-01
2017-01-01
2017-02-01
2017-03-01
2017-04-01
2017-05-01
...

还有表weeklyhours

date (date) | hours (time)
--------------------------
2017-01-01  |   05:00:00
2017-01-03  |   12:00:00

我想要一个 SELECT 查询来合并两个表并获得以下输出 result

date (date) | hours (time)
--------------------------
2016-11-01  |     NULL
2016-12-01  |     NULL
2017-01-01  |   05:00:00
2017-02-01  |   05:00:00
2017-03-01  |   12:00:00
2017-04-01  |   12:00:00
2017-05-01  |   12:00:00
...

所以我需要将weekylhours 表与months 表连接起来,但我失败了。我在过去两个小时内尝试过,但没有成功。

感谢您的帮助。

【问题讨论】:

  • 您尝试的条件是什么?
  • 我已经尝试使用额外的 JOIN 来获取最近的日期,这样我就可以在以下日期使用相同的值。通过一个简单的 LEFT JOIN(参见 Yousaf 的回答),我将得到 '2017-02-01' 和 'weeklyhours'=5,但 '2017-02-02' 将具有 NULL 作为weeklyhours。但在'2017-03-01'之前我也需要它是5

标签: mysql sql


【解决方案1】:

这是一个老问题,但如果其他人需要,这里有一个答案。另请注意,初始帖子中存在错误。第二个日期应该是 2017-03-01 而不是 2017-01-03(否则没有月差)。

总的来说,这依赖于“每周工作时间”是一个累积值。周期值只需要在初始连接中求和小时数,而不必找到最大日期然后创建第二个连接。

DECLARE @temp_months TABLE(
    [mth] [date] NOT NULL
)

DECLARE @temp_weeklyhours TABLE(
    [Date] [date] NOT NULL,
    [Hours] [time] not null
)

INSERT INTO @temp_months (mth)  
VALUES  ('2016-11-01'),
        ('2017-12-01'),
        ('2017-01-01'),
        ('2017-02-01'),
        ('2017-03-01'),
        ('2017-04-01'),
        ('2017-05-01')

INSERT INTO @temp_weeklyhours ([Date],[Hours])  
VALUES  ('2017-01-01','05:00:00'),
        ('2017-03-01','12:00:00')

SELECT t.mth as [Date], [Hours]
FROM
        (
            SELECT m.mth, max([Date]) UseDate
            FROM    
                    @temp_months as m
                LEFT JOIN 
                    @temp_weeklyhours as w
                ON m.mth >= w.[Date]
            GROUP BY m.mth
        ) as t
    LEFT JOIN
        @temp_weeklyhours as h
    ON t.UseDate = h.[Date]
ORDER BY t.mth

【讨论】:

    猜你喜欢
    • 2019-11-18
    • 2017-08-28
    • 1970-01-01
    • 2021-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多