说,我有一个表格,代表编号框中的彩色和标记的项目。
每个盒子不能包含多个带有特定标签的物品,但具有相同标签(以及相同或不同颜色)的物品在其他盒子中可能是唯一的。
过度简化,使用 PostgreSQL,我们可以得到下表:
CREATE TABLE items (
label character varying,
color character varying,
box_number integer
);
INSERT INTO items VALUES
('a','red',1),
('b','blue',1),
('c','blue',1),
('a','red',2),
('c','green',2),
('d','blue',2),
('b','red',3),
('d','green',3);
Run Code Online (Sandbox Code Playgroud)
我想知道编号为 3 的箱子内所有物品的标签和颜色,以及可以找到具有相同标签的物品的所有箱子编号。换句话说,我试图:
SELECT label, boxes
FROM (
SELECT label, array_agg(DISTINCT box_number) AS boxes
FROM items
GROUP BY label
) AS sub1
WHERE 3 = ANY(boxes);
Run Code Online (Sandbox Code Playgroud)
但我还需要返回color
列,仅显示框号 3 内项目的颜色。
对于示例数据,输出应该是这样的:
标签 | 颜色 | 盒子 ------+-------+------ 乙 | 红色 | 1,3 d | 绿色| 2,3
我确信以前有人问过这个问题,但由于这个问题可以用多种不同的方式表达,因此很难找到正确的答案。
我有一个订单表,其中订单号有一个varchar字段,其格式为 4 位年份、破折号 (-) 和渐进数值。例如,它可能包含以下值:
SELECT number FROM orders ORDER BY number LIMIT 10;
number
----------
1999-13
2019-11
2020-1
2020-10
2020-100
2020-12
2020-2
2020-21
2020-3
2021-1
Run Code Online (Sandbox Code Playgroud)
我需要按年份对该字段进行排序,然后按渐进数字进行排序,预期结果如下:
number
----------
1999-13
2019-11
2020-1
2020-2
2020-3
2020-10
2020-12
2020-21
2020-100
2021-1
Run Code Online (Sandbox Code Playgroud)
我的问题是:
我想至少保留第一个答案尽可能与数据库无关(这就是为什么我没有包含数据库特定标签的原因),但是如果不同的 DBMS/版本可能有不同的最佳答案,那么我们假设 PostgreSQL 12。