CREATE TYPE edition AS ENUM (
'b',
'j'
);
CREATE TABLE IF NOT EXISTS versions (
id uuid PRIMARY KEY DEFAULT uuid_generate_v4(),
edition edition NOT NULL,
major integer NOT NULL,
minor integer NOT NULL,
patch integer NOT NULL,
cycle decimal GENERATED ALWAYS AS (
CAST(
(CAST(major AS text) || '.' || CAST(minor AS text)) AS decimal
)
) STORED
);
INSERT INTO versions
(edition, major, minor, patch)
VALUES
('b', 1, 16, 0),
('b', 1, 17, 0),
('b', 1, 18, 0),
('b', 1, 19, 0),
('j', 1, 16, 0),
('j', 1, 17, 0),
('j', 1, 18, 0),
('j', 1, 19, 0)
;
我正在构建一个Web应用程序来引用Minecraft的各个方面。我试图在我的versions
表中构建一个存储生成列,以指定所讨论的记录是否指定了每个版本的最高版本号。(Minecraft发布为两个独立且不兼容的版本:基岩(b
)和 java (j
)。)
给定上面的结构和数据,我希望下面的select语句只为每个is_latest_*
字段返回一次true
,为所有其他字段返回false
。
SELECT
*,
(
edition = 'b'
AND GREATEST(major) = major
AND GREATEST(minor) = minor
AND GREATEST(patch) = patch
) AS is_latest_bedrock,
(
edition = 'j'
AND GREATEST(major) = major
AND GREATEST(minor) = minor
AND GREATEST(patch) = patch
) AS is_latest_java
FROM versions
ORDER BY edition, major, minor, patch;
相反,我看到的是,每个记录都被标记为每个相应版本的最高版本:
| 标识符|版本|主要的|次要的|补片|循环|是最新基岩|是最新的java|
| - -|- -|- -|- -|- -|- -|- -|- -|
| 1999年,在美国的一个实验室里,|最佳|一个|十六|第0页|一点一六分|真的|假的|
| 20 d1 bf 38 - 75d 6 - 4d 96 - 94 fc-fd 16 d2131319的第一代产品|B|一个|十七岁|第0页|一点一七分|真的|假的|
| 13252697- 4Fe 6 - 411 F-B151-E4 A1 CA 146 E2 F的一种金属 MOXy |B|一个|十八|第0页|一点一八分|真的|假的|
| 16 a1 eb 78-e566-4649- 991 c-3ecdd 8 e6 f49 b的电子邮件地址|B|一个|十九|第0页|一点一九分|真的|假的|
| 5E 4657 a-C4 FC-41 F4-B2 E1 - 0aa 88 e0 e4 b 07型电动汽车|j型|一个|十六|第0页|一点一六分|假的|真的|
| 三氟甲磺酸钠|j型|一个|十七岁|第0页|一点一七分|假的|真的|
| 729 - 6 fc 353 a7 c939型柴油机|j型|一个|十八|第0页|一点一八分|假的|真的|
| 09293 DB 6-AA 6 B-4CC 4 - 8A 58 - 29 AFBA 816 D85型柴油机|j型|一个|十九|第0页|一点一九分|假的|真的|
下面是我期望/想要看到的结果集:
| 标识符|版本|主要的|次要的|补片|循环|是最新基岩|是最新的java|
| - -|- -|- -|- -|- -|- -|- -|- -|
| 1999年,在美国的一个实验室里,|B|一个|十六|第0页|一点一六分|假的|假的|
| 20 d1 bf 38 - 75d 6 - 4d 96 - 94 fc-fd 16 d2131319的第一代产品|B|一个|十七岁|第0页|一点一七分|假的|假的|
| 13252697- 4Fe 6 - 411 F-B151-E4 A1 CA 146 E2 F的一种金属 MOXy |B|一个|十八|第0页|一点一八分|假的|假的|
| 16 a1 eb 78-e566-4649- 991 c-3ecdd 8 e6 f49 b的电子邮件地址|B|一个|十九|第0页|一点一九分|真的|假的|
| 5E 4657 a-C4 FC-41 F4-B2 E1 - 0aa 88 e0 e4 b 07型电动汽车|j型|一个|十六|第0页|一点一六分|假的|假的|
| 三氟甲磺酸钠|j型|一个|十七岁|第0页|一点一七分|假的|假的|
| 729 - 6 fc 353 a7 c939型柴油机|j型|一个|十八|第0页|一点一八分|假的|假的|
| 09293 DB 6-AA 6 B-4CC 4 - 8A 58 - 29 AFBA 816 D85型柴油机|j型|一个|十九|第0页|一点一九分|假的|真的|
如何更新查询以仅将一个Bedrock版本和一个Java版本标记为最新版本?
1条答案
按热度按时间2j4z5cfb1#
ROW_NUMBER窗口函数,并且在
edition
类型上进行分区可能是这种情况下的一个很好的解决方案-在这种情况下,您仍然希望返回所有记录。请参见下面的查询,该查询在
edition
类型上打开窗口,并为每条记录分配一个行号,按major
、minor
、patch
降序排序。= 1
用于判断该记录是否为窗口排序中的第一个记录。表中将来可能添加的任何 *edition
类型。查询:
结果:
| 标识符|版本|主要的|次要的|补片|循环|是版本的最新版本|
| - -|- -|- -|- -|- -|- -|- -|
| 874 a-9322 ce 708 b型,可用于各种类型的电子设备。|B|一个|十六|第0页|一点一六分|假的|
| 9d 5 fc 712 - 819 f-4d 9d-ada 7-fa 5371 ae 1a 7 e型激光器|B|一个|十七岁|第0页|一点一七分|假的|
| 046 c76 f2-c8 be-4686-ab 0 d-1387 fd 798579的一种药物组合物|B|一个|十八|第0页|一点一八分|假的|
| 3BA 9 B494-乙酰氟4 - 4 EDA-AE 46-B305 ABEBF 93 D| B|一个|十九|第0页|一点一九分|真的|
| 87 c2552 b-3591- 416 a-baa 1 - 6297 b3 b 0 e6 c2的控制器上的一个或多个控制器|j型|一个|十六|第0页|一点一六分|假的|
| 51872 b 9 b-EC 3f-45 d3 - 8be 7 - 532946 b699 a8型电动汽车|j型|一个|十七岁|第0页|一点一七分|假的|
| 2205 b1 df-4d 7 b-4 eee-ac 17-c153 f2374339的第一个字母数字表示的数字|j型|一个|十八|第0页|一点一八分|假的|
| 产品编号:|j型|一个|十九|第0页|一点一九分|真的|
数据库小提琴:https://www.db-fiddle.com/f/sB7zE1syp8xNmnEk2oizCR/0