首页 > 解决方案 > 使用 SQL 解决逻辑问题

问题描述

我正在尝试解决一个有趣的工作练习的问题,表明可以使用 SQL 来解决它。这是一个谜题,如下所示:

在海上航行中成功航行是一项具有挑战性的任务。船长最重要的决定是为航行选择合适的船员。需要多种不同的技能组合才能有效地航行船舶,导航到目的地,并沿途捕鱼作为食物。表 1 显示了可供您在航程中雇用的船员名单。每个船员都要求航行的薪水,并具有不同的钓鱼、航行和导航技能水平。为了使您的旅程取得成功,您必须在您选择的所有船员的三个技能类别中的每一个中累积 15 或更多技能。您可以选择任意数量的船员。问题:航行的最低可实现成本是多少?”

我会说我是我认为的中级到高级(取决于情况)SQL 用户。

不是要求每个人回答,但我已经考虑过最好的解决方法,我首先考虑WHILE以某种方式使用循环。我创建了一个表来保存数据并添加了一个“salary_ranking”列(如下)。我很好奇是否有人对路线有任何提示或建议?我想使用我以前从未使用过的东西,但也试图获得最有效的答案。

这是数据(我添加了最后一列):

NAME       FISHING     SAILING     NAVIGATION  SALARY      SALARY_RANK
---------- ----------- ----------- ----------- ----------- -----------
Amy        3           5           1           46000       3
Bill       1           2           5           43000       2
Carl       3           4           2           47000       4
Dan        4           3           1           36000       1
Eva        4           2           2           43000       2
Fred       1           3           4           55000       5
Greg       3           1           5           68000       8
Henry      5           4           2           64000       7
Ida        3           3           3           60000       6

(9 rows affected)

标签: sqlsql-server

解决方案


这是一个 CTE 版本,我首先创建测试数据,然后运行递归查询,使用 MaxID 来防止它执行所有排列。

declare @t table(Id int, NAME varchar(10), FISHING int, SAILING int, NAVIGATION int, SALARY int)

insert @t values (1,'Amy',3,5,1,46000)
    ,(2,'Bill',1,2,5,43000 )
    ,(3,'Carl',3,4,2,47000)
    ,(4,'Dan',4,3,1,36000)
    ,(5,'Eva',4,2,2,43000)
    ,(6,'Fred',1,3,4,55000)
    ,(7,'Greg',3,1,5,68000)
    ,(8,'Henry',5,4,2,64000)
    ,(9,'Ida',3,3,3,60000 )

;with cte as (
    select convert(varchar(1000),name) as crew, fishing, sailing, navigation, salary, ID as MaxID from @t
    union all
    select convert(varchar(1000),cte.crew+', '+ t.name), cte.fishing+t.fishing, cte.sailing+t.sailing, cte.navigation+t.navigation, cte.salary+t.salary, t.ID
    from @t t
    join cte on t.ID>cte.MaxID
    )
select top 1 crew,fishing,sailing,navigation,salary
from cte 
where fishing>=15 and sailing>=15 and navigation>=15 
order by salary

结果是:

crew                            fishing sailing navigation  salary  
Amy, Bill, Carl, Greg, Henry    15      16      15          268000  

推荐阅读