SQL:具有来自不同单元格的减法的复杂查询

时间:2015-06-18 10:33:05

标签: sql postgresql subquery subtraction

我有两张桌子,我想合并他们的数据。

第一张表

+------------+-----+------+-------+
| BusinessID | Lat | Long | Stars |
+------------+-----+------+-------+
| abc123     |  32 |   74 | 4.5   |
| abd123     |  32 |   75 | 4     |
| abe123     |  33 |   76 | 3     |
+------------+-----+------+-------+

第二个表是:

+------------+-----+------+-------+
| BusinessID | day | time | count |
+------------+-----+------+-------+
| abc123     |   1 |   14 |     5 |
| abc123     |   1 |   15 |     6 |
| abc123     |   2 |   13 |     1 |
| abd123     |   4 |   12 |     4 |
| abd123     |   4 |   13 |     8 |
| abd123     |   5 |   11 |     2 |
+------------+-----+------+-------+

所以我想要做的就是找到所有具有特定半径的企业,并在接下来的一小时内获得比当前更多的支票。

结果是

+------------+
| BusinessID |
+------------+
| abd123     |
| abc123     |
+------------+

因为他们在接下来的一小时内有比以前更多的办理登机手续(6> 5,8> 4)

如果结果按照登记入住号码的差异排序,那将更有帮助。防爆。 (8-4 + 6-5)

SELECT *
FROM table2 t2
WHERE t2.BusinessID IN (
    SELECT t1.BusinessID 
    FROM table1 t1
    WHERE earth_box(ll_to_earth(32, 74), 4000/1.609) @> ll_to_earth(Lat, Long)
    ORDER by earth_distance(ll_to_earth(32, 74), ll_to_earth(Lat, Long)), stars DESC
    ) AND checkin_day = 1 AND checkin_time = 14;

从上面的查询中我可以找到半径中的商家,然后在指定的时间内找到他们的签到。防爆。 14.我现在需要做的是找到15小时(相同业务)的签到数量,并查看签到的数量是否大于上一次。

1 个答案:

答案 0 :(得分:1)

我想你想要这样的东西:

SELECT
    t1.BusinessID
FROM
    table1 t1
    JOIN
    (SELECT
        *,
        "count" - LAG("count") OVER (PARTITION BY BusinessID, "day" ORDER BY "time") "grow"
    FROM 
        table2
    WHERE
        /* Some condition on table2 */) t2
    ON t1.BusinessID = t2.BusinessID AND t2.grow > 0
WHERE
        /* Some condition on table1 */
ORDER BY
    t2.grow DESC;