postgresql - PostgreSQL - 按array_position排序并在另一列上不同
问题描述
我有一个看起来像这样的查询(实际查询和表更复杂):
SELECT item.other_uuid, item.uuid, category.name
FROM item, category
WHERE ...
ORDER BY array_position(ARRAY[{'CDX', 'KDJ', 'PLM', 'OLA', 'OWK', 'CAT'}]::uuid[], item.uuid), category.name;
这给了我一个按特定顺序(数组传递的 uuid 顺序)的类别名称列表。例如:
789 CDX "Cat D"
123 KDJ "Cat A"
456 PLM "Cat B"
123 OLA "Cat F"
456 OWK "Cat X"
123 CAT "Cat Z"
我想做的是在该查询中添加一个 DISTINCT ON 'item.other_uuid'。所以结果列表将是:
789 CDX "Cat D"
123 KDJ "Cat A"
456 CAT "Cat B"
我怎样才能做到这一点?Postgres 希望 ORDER BY & DISTINCT 匹配,但这不是我查询的正确顺序。
我试图将其设为子查询并在主查询中使用 DISTINCT 但未维护顺序...
解决方案
这里有两个组件,为每组“other_uuid”选择哪个成员,以及这些选定行的显示顺序。如果您希望管理这两个内容,您可能需要一个内部查询和一个外部查询,每个用他们自己的 ORDER BY。
select * from (
SELECT distinct on (other_uuid)other_uuid, uuid, name
FROM ...
ORDER BY other_uuid, array_position(ARRAY['CDX', 'KDJ', 'PLM', 'OLA', 'OWK', 'CAT']::text[], uuid), name
) foo order by array_position(ARRAY['CDX', 'KDJ', 'PLM', 'OLA', 'OWK', 'CAT']::text[], uuid);
array_position 表达式的重复是丑陋的。有一些方法可以避免它,但这些方法也很丑陋。
推荐阅读
- excel - 将范围作为行多次插入另一个工作表
- react-native - 无法将 ReactNative 从版本 0.59.x 升级到最新版本 0.64.x
- java - java类中的模拟scala对象方法调用
- apache-spark - spark的行为像图书馆吗?
- php - 后数组不存储文件输入
- mysql - 如何在mysql中按范围分组并执行聚合?
- c - 在 C 中查找字符的 ASCII 码
- dataframe - DataFrames : 没有方法匹配 setindex!(::DataFrame, ::Tuple{Float64, Float64}, ::Colon, ::String)
- pytorch - 如何理解不满足 Cauchy Reimann 方程的复杂函数的梯度
- oracle - Oracle LogMiner 结果不一致