sql - 使用 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)
解决方案
这是一个 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
推荐阅读
- javascript - 如何播放捕获的视频?
- ruby - 如何使用两个布尔语句修复输入结束
- android - 当模拟对象在 lambda 内部时单元测试失败,但是当它在 lambda 外部并在 lambda 内部使用时工作?
- javascript - 将无效的 HTML 表解析为 JSON
- php - 正则表达式 HTML 注释 (PCRE)
- gitlab-ci-runner - 如何使用柯南遥控器配置 gitlab-runner?
- sql - 用 nulliff 替换 NULL 返回不同的查询结果
- database - 如何编辑我的代码,以便我可以解释与我的 sed 命令相反的输出
- datetime - 如何根据时间间隔条件对行进行分组和计数
- ios - 在 iOS13 中以模态方式显示的插页式广告出现问题