|
楼主 |
发表于 2024-9-24 21:29
|
显示全部楼层
本帖最后由 wabjtam123 于 2024-9-24 21:39 编辑
最简模型设计与SQL实现
我们可以做一个最小化的例子来示例说明一下该如何实现,以下是最简化的设计说明,实际情况当然远比这要复杂的多!
首先,创建表:
CREATE TABLE TRAIN_SEATS (
SEAT_ID NUMBER PRIMARY KEY,
TRAIN_ID VARCHAR2(10),
CAR_NO NUMBER,
SEAT_NO VARCHAR2(3),
SEGMENT NUMBER,
STATUS VARCHAR2(10)
);
插入示例数据:
INSERT INTO TRAIN_SEATS VALUES (1, 'G322', 10, '13F', 1, 'AVAILABLE');
INSERT INTO TRAIN_SEATS VALUES (2, 'G322', 10, '13F', 2, 'OCCUPIED');
INSERT INTO TRAIN_SEATS VALUES (3, 'G322', 10, '13F', 3, 'AVAILABLE');
INSERT INTO TRAIN_SEATS VALUES (4, 'G322', 10, '07C', 1, 'OCCUPIED');
INSERT INTO TRAIN_SEATS VALUES (5, 'G322', 10, '07C', 2, 'AVAILABLE');
INSERT INTO TRAIN_SEATS VALUES (6, 'G322', 10, '07C', 3, 'AVAILABLE');
以下是SQL实现的代码,具体如下。
WITH AVAILABLE_SEATS AS (
SELECT
CAR_NO, -- 车厢号
SEAT_NO, -- 座位号
SEGMENT, -- 行程段(1:福州到杭州,2:杭州到南京,3:南京到北京)
STATUS, -- 座位状态
ROW_NUMBER() OVER (
PARTITION BY SEGMENT
ORDER BY CAR_NO, SEAT_NO
) AS RN -- 为每个行程段的可用座位分配一个**的行号
FROM TRAIN_SEATS
WHERE TRAIN_ID = 'G322' -- 只选择G322列车的座位
AND STATUS = 'AVAILABLE' -- 只选择可用的座位
)
SELECT
CASE
-- 如果三个行程段都有可用座位,则可以全程乘坐
WHEN COUNT(DISTINCT SEGMENT) = 3 THEN '可以全程乘坐'
-- 如果至少有一个行程段有可用座位,则需要换座
WHEN COUNT(DISTINCT SEGMENT) >= 1 THEN '需要换座'
-- 如果没有任何可用座位,则无法完成行程
ELSE '无法完成行程'
END AS TRAVEL_PLAN,
-- 使用LISTAGG函数将所有可用座位信息连接成一个字符串
LISTAGG('段' || SEGMENT || ':' || CAR_NO || '车' || SEAT_NO || '座', ' -> ')
WITHIN GROUP (ORDER BY SEGMENT) AS SEAT_ARRANGEMENT
FROM AVAILABLE_SEATS
WHERE RN = 1 -- 只选择每个行程段的第一个可用座位
GROUP BY RN; -- 由于RN总是1,这里的GROUP BY实际上是将所有结果合并成一行
具体实现结果如下所示: TRAVEL_PLAN | SEAT_ARRANGEMENT
------------+--------------------------------------------------
需要换座 | 段1:10车13F座 -> 段2:10车07C座 -> 段3:10车07C座
|
|