考虑两个表:
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
的最新值。
任何人都知道怎么做?
答案 0 :(得分: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_visit
加到表house_id
上,并且date
介于market_status
的日期范围之间。
答案 1 :(得分:0)
你的问题的逻辑是下一个。
您需要将第一行日期字段与house_market_changes表中的第二行字段进行比较,并检查em之间的范围。如果date1&lt; date2,agent_visit表中的所有行都将具有date1的market_status,并在下一次迭代时再次执行(if(date2&lt; date3)...)。
我的问题是我不是SQL中的专业人员所以我无法将其转换为SQL代码,我希望这可以帮助您以任何形式