sql - postgreSQL - 查找特定工具的下一课
问题描述
我正在尝试编写一个 PostgreSQL 查询来列出两种可供出租的乐器,每月租金最低,还告诉每个列出的乐器的下一课何时安排。我有这两张表:
//Table lesson
lesson_id | instrument_type | start
001 | 01 | 2021-02-01
002 | 01 | 2021-02-02
003 | 02 | 2021-02-04
004 | 02 | 2021-02-05
005 | 03 | 2021-02-06
//Table instrument
instrument_id | fee_per_month | availability
01 | 300 | yes
02 | 400 | no
03 | 500 | yes
而且我要:
instrument_type | fee_per_month | lesson_id | start
01 | 300 | 001 | 2021-02-01
03 | 500 | 005 | 2021-02-06
SQL 对我来说是新的,我已经尽了最大努力但没有成功:
SELECT
instrument.type AS "instrument",
instrument.fee_per_month AS "fee/month",
lesson.start AS "next lesson"
FROM instrument, lesson
LEFT JOIN LATERAL (
SELECT lesson.*
FROM lesson
WHERE lesson.start >= current_timestamp AND lesson.instrument_type = instrument.type
ORDER BY lesson.start
limit 1
) lesson on true
GROUP BY "instrument", "rent/month", "next lesson"
ORDER BY "rent/month"
limit 2;
我应该如何正确地做到这一点?
解决方案
嗯。. . 我认为你在正确的轨道上。如果我理解正确:
SELECT i.instrument_id AS "instrument", i.fee_per_month,
l.lesson_id, l.start AS "next lesson"
FROM instrument i LEFT JOIN LATERAL
(SELECT l.*
FROM lesson l
WHERE l.start >= current_timestamp AND
l.instrument_id = i.instrument_id
ORDER BY l.start
LIMIT 1
) l
ON true
WHERE i.availability = 'yes'
ORDER BY i.fee_per_month
LIMIT 2;
这修复了查询、逻辑和事物的名称。 这是一个 db<>fiddle。
主要区别在于:
instrument
和之间没有笛卡尔积lesson
。- 引入表别名,使查询更易于编写和阅读。
- 删除
GROUP BY
. 不需要聚合。
推荐阅读
- node.js - ts-jest 禁用 babel,babel 似乎仍在运行
- lambda - lambda 表达式中逗号的 F# 语法
- mysql - 在nodejs mysql的选择查询中将数组作为值传递
- linux - 如何确定 systemd EnvironmentFile 将设置的精确环境变量集?
- python - 如何在 keras 顺序模型中获取来自未来的输出
- cypress - 在 Cypress 的 Save as 对话框中单击下载按钮后获取文件名
- c# - 在子节点使用 c# 解析 Soap XML 响应
- java - Spring Webflux - 使用Webflux webclient时不显示记录连接ID和新连接日志
- pip - 有什么方法可以使用 pip 获取没有版本信息的已安装模块?
- google-cloud-platform - 错误:无法部署资产“webhooks/ActionsOnGoogleFulfillment”