1

考虑两个表:

house_market_changes
 date        | house_id | market_status
---------------------------------
 2013-04-03  | 1        | "on"
 2013-04-06  | 1        | "under offer"
 2013-04-11  | 1        | "off"
 2013-04-02  | 2        | "on"
 ...

house_market_changes告诉我们房子变成了什么以及什么时候改变的。

agent_visit
 date        | house_id | agent_id
---------------------------------
 2013-04-05  | 1        | 1
 2013-04-06  | 1        | 1
 2013-04-08  | 1        | 1
 2013-04-09  | 1        | 1
 2013-04-10  | 1        | 1
 2013-04-12  | 1        | 1
 ...

agent_visit告诉我们代理人什么时候去参观房子。

我想要一个带有这些结果的查询:

agent_visit_info
 date        | house_id | agent_id | house_market_status
-----------------------------------------------
 2013-04-05  | 1        | 1        | "on"
 2013-04-06  | 1        | 1        | "under offer"
 2013-04-08  | 1        | 1        | "under offer"
 2013-04-09  | 1        | 1        | "under offer"
 2013-04-10  | 1        | 1        | "under offer"
 2013-04-12  | 1        | 1        | "off"
 ...

house_market_status列告诉我们房屋在该日期的状态。访问日期之前或当天的house_market_status最新值也是如此。market_status

有人知道怎么做吗?

4

2 回答 2

0

这是一个混乱的陈述,但我认为会给你你想要的结果,

SELECT  b.*, a.market_status
FROM
        (
            SELECT  a.date StartDate,
                    COALESCE(b.date - INTERVAL 1 DAY, a.date + INTERVAL 999 YEAR) EndDate,
                    a.house_id,
                    a.market_status
            FROM
                    (
                        SELECT  a.date, 
                                a.house_id, 
                                a.market_status,
                                (
                                    SELECT  COUNT(*)
                                    FROM    house_market_changes b
                                    WHERE   b.house_id = a.house_id AND
                                            b.date <= a.date
                                ) AS RowNumber
                        FROM    house_market_changes a
                    ) a 
                    LEFT JOIN
                    (
                        SELECT  a.date, 
                                a.house_id, 
                                a.market_status,
                                (
                                    SELECT  COUNT(*)
                                    FROM    house_market_changes b
                                    WHERE   b.house_id = a.house_id AND
                                            b.date <= a.date
                                ) AS RowNumber
                        FROM    house_market_changes a
                    ) b ON  a.house_id = b.house_id AND
                            a.RowNumber + 1 = b.RowNumber
        ) a
        INNER JOIN agent_visit b
            ON  b.date BETWEEN a.StartDate AND a.EndDate AND
                a.house_id = b.house_id

输出

╔════════════╦══════════╦══════════╦═══════════════╗
║    DATE    ║ HOUSE_ID ║ AGENT_ID ║ MARKET_STATUS ║
╠════════════╬══════════╬══════════╬═══════════════╣
║ 2013-04-05 ║        1 ║        1 ║ on            ║
║ 2013-04-06 ║        1 ║        1 ║ under offer   ║
║ 2013-04-08 ║        1 ║        1 ║ under offer   ║
║ 2013-04-09 ║        1 ║        1 ║ under offer   ║
║ 2013-04-10 ║        1 ║        1 ║ under offer   ║
║ 2013-04-12 ║        1 ║        1 ║ off           ║
╚════════════╩══════════╩══════════╩═══════════════╝

简要说明:

查询需要为每个 house_id将用于加入另一个子查询的序列号生成序列号,获取. market_status子查询的结果记录将通过 连接到表中agent_visithouse_id并且date介于market_status.

于 2013-07-19T17:26:49.153 回答
0

你的问题的逻辑是下一个。

您需要将第一行日期字段与 house_market_changes 表中的第二行字段进行比较,并检查 em 之间的范围。如果 date1 < date2,agent_visit 表中的所有行都将具有 date1 的 market_status 并在下一次迭代中再次执行( if(date2 < date3) ... )。

我的问题是我在 SQL 方面不是那么专业,所以我不能将其转化为 SQL 代码,我希望这能以任何形式帮助你

于 2013-07-19T18:05:42.087 回答