【问题标题】:How to build logic for this SQL question?如何为这个 SQL 问题构建逻辑?
【发布时间】:2022-12-14 12:58:46
【问题描述】:

一家滑雪度假村公司计划利用现有的山间小屋网络和它们之间的小径建造一个新的滑雪场。新的斜坡必须从其中一个山间小屋开始,在另一个小屋有一个中间站,通过一条直接路径与第一个小屋相连,并在第三个山间小屋结束,第三个山间小屋也通过一条直接路径连接到第二个小屋。选择建造滑雪场的三个小屋的高度必须严格递减。

给你两个表:

create table mountains_huts ( id integer not null, name archer(40) not null, altitude integer not null, unique(name), unique(id);

create table trails (hut1 integer not null, hut 2 integer not null);

表 trails 中的每个条目代表具有 IDS hut1 和 hut2 的小屋之间的直接连接。所有路径都是双向的。

创建一个查询,查找所有代表可能用于建造滑雪场的山间小屋的三元组(startpt、midpt、endpt)。

鉴于表格:

山间小屋

id name altitude
1 Dakonat 1900
2 Natisa 2100
3 Gajantut 1600
4 Rifat 782
5 Tupur 1370

小径

hut1 hut2
1 3
3 2
3 5
4 5
1 5

这是我测试的问题之一。我完全迷失了解决这个问题的方法。我使用引导函数在 (start, mid, end) 中组织数据,但无法用尽所有组合。

【问题讨论】:

标签: sql logic common-table-expression lag


【解决方案1】:

您可以使用以下两步法:

  1. 以某种方式在trails表中订购您的小屋,以便 hut1 海拔高度始终大于 hut2 海拔高度
  2. 在上面第 1 步的表上使用自连接来查找中点
    WITH ordered_huts AS -- ordering huts by altitude
    (
        SELECT  CASE WHEN h1.altitude > h2.altitude THEN h1.id ELSE h2.id END AS hut1
               ,CASE WHEN h1.altitude > h2.altitude THEN h2.id ELSE h1.id END AS hut2
               ,CASE WHEN h1.altitude > h2.altitude THEN h1.altitude ELSE h2.altitude END AS hut1_altitude
               ,CASE WHEN h1.altitude > h2.altitude THEN h2.altitude ELSE h1.altitude END AS hut2_altitude
        FROM trails
        LEFT JOIN mountain_huts as h1 -- getting altitude for hut1
             ON trails.hut1 = h1.id
        LEFT JOIN mountain_huts as h2 -- getting altitude for hut2
             ON trails.hut2 = h2.id
    )
    
    SELECT startpt.hut1 AS startpt -- starting point
          ,midpt.hut1 AS midpt -- mid-point
          ,midpt.hut2 AS endpt -- end-point
    FROM ordered_huts AS startpt
    JOIN ordered_huts as midpt
         ON  startpt.hut2 = midpt.hut1 -- finding all of the mid-points
    

    这里的假设是您只考虑一个中点(即没有直接连接也没有多跳)。

    这是 T-SQL 方言。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-12
    • 1970-01-01
    • 2012-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多