小编Cla*_*ani的帖子

聚合一列中在另一列中没有匹配项的丢弃值

说,我有一个表格,代表编号框中的彩色和标记的项目。
每个盒子不能包含多个带有特定标签的物品,但具有相同标签(以及相同或不同颜色)的物品在其他盒子中可能是唯一的。

过度简化,使用 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

这是示例SQL …

postgresql aggregate

5
推荐指数
1
解决办法
233
查看次数

按数字字段对 varchar 进行排序

我确信以前有人问过这个问题,但由于这个问题可以用多种不同的方式表达,因此很难找到正确的答案。

我有一个订单表,其中订单有一个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)

数据库小提琴在这里

我的问题是:

  1. 使用 ORDER 子条款实现此目的最简单的方法是什么?
  2. 如何使用这种自定义排序添加高效索引而无需修改表?

我想至少保留第一个答案尽可能与数据库无关(这就是为什么我没有包含数据库特定标签的原因),但是如果不同的 DBMS/版本可能有不同的最佳答案,那么我们假设 PostgreSQL 12。

postgresql order-by natural-sort postgresql-12

1
推荐指数
1
解决办法
1696
查看次数