PostgreSQL 中的多个 DISTINCT ON 子句

2024-04-19

是否可以选择以下行DISTINCT ON一些单独的、独立的列集?

假设我想要满足以下条件的所有行:

  • 明显于(name, birth)
  • 明显于(name, height)

因此,在下表中,标有红叉的行不会有所不同(并指示失败的子句):

name      birth    height
--------------------------
William    1976      1.82
James      1981      1.68
Mike       1976      1.68
Tom        1967      1.79
William    1976      1.74   ❌ (name, birth)
William    1981      1.82   ❌ (name, height)
Tom        1978      1.92
Mike       1963      1.68   ❌ (name, height)
Tom        1971      1.86
James      1981      1.77   ❌ (name, birth)
Tom        1971      1.89   ❌ (name, birth)

在上面的例子中,如果DISTINCT ON条款刚刚被DISTINCT ON (name, birth, height),那么所有行都将被视为不同的。

尝试过但没有成功:

  • SELECT DISTINCT ON (name, birth) (name, height) ...
  • SELECT DISTINCT ON (name, birth), (name, height) ...
  • SELECT DISTINCT ON ((name, birth), (name, height)) ...
  • SELECT DISTINCT ON (name, birth) AND (name, height) ...
  • SELECT DISTINCT ON (name, birth) AND ON (name, height) ...
  • SELECT DISTINCT ON (name, birth) DISTINCT ON (name, height) ...
  • SELECT DISTINCT ON (name, birth), DISTINCT ON (name, height) ...

正如评论的 https://stackoverflow.com/questions/42505531/multiple-distinct-on-clauses-in-postgresql/42512809#comment72161230_42505531,问题中有歧义。每次调用的结果行数可能不同。如果您对任意结果感到满意,@klin的解决方案 https://stackoverflow.com/a/42505793/939860就足够好了。否则,您需要更严格地定义需求。喜欢:
明显于(name, birth),首先选择最小的高度,然后选择最小的 ID 作为决胜局

Or:
明显于(name, height),先选择最早出生的,然后选择最小的 ID 作为决胜局

您的表应该有一个主键(或some唯一标识行的方法):

CREATE TEMP TABLE tbl (
  tbl_id serial PRIMARY KEY
, name text
, birth int
, height numeric);

INSERT INTO tbl (name, birth, height)
VALUES
  ('William', 1976, 1.82)
, ('James',   1981, 1.68)
, ('Mike',    1976, 1.68)
, ('Tom',     1967, 1.79)
, ('William', 1976, 1.74)
, ('William', 1981, 1.82)
, ('Tom',     1978, 1.92)
, ('Mike',    1963, 1.68)
, ('Tom',     1971, 1.86)
, ('James',   1981, 1.77)
, ('Tom',     1971, 1.89);

Query:

SELECT DISTINCT ON (name, height) *
FROM  (
   SELECT DISTINCT ON (name, birth) *
   FROM   tbl
   ORDER  BY name, birth, height, tbl_id  -- pick smallest height, ID as tiebreaker
   ) sub
ORDER  BY name, height, birth, tbl_id;    -- pick earliest birth, ID as tiebreaker
 tbl_id |  name   | birth | height
--------+---------+-------+--------
      2 | James   |  1981 |   1.68
      8 | Mike    |  1963 |   1.68
      4 | Tom     |  1967 |   1.79
      9 | Tom     |  1971 |   1.86
      7 | Tom     |  1978 |   1.92
      5 | William |  1976 |   1.74
      6 | William |  1981 |   1.82
(7 rows)    -- !!!

A DISTINCT ON没有确定性的查询ORDER BY可以从每组重复数据中返回任意行。应用一次,您仍然可以获得确定数量的行(任意选择)。重复应用,生成的行数也是任意的。有关的:

  • 选择每个 GROUP BY 组中的第一行? https://stackoverflow.com/questions/3800551/select-first-row-in-each-group-by-group/7630564#7630564
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PostgreSQL 中的多个 DISTINCT ON 子句 的相关文章

随机推荐

  • 使用 Google Reflections 获取所有类的列表 - 但 java.* 似乎丢失了

    我正在使用 google Reflections 包来构建可调用的所有类的索引 以下代码应该返回 JVM 中加载的所有类 List
  • C#中从WebApi获取数据

    我有 webapi 和她的方法 HttpPost HttpGet ActionName GetData public MyData GetData FromUri MyData data return datamanager get dat
  • 使用 YouTube API 仅搜索 YouTube 上的音乐曲目

    我想使用 YouTube API v3 来仅搜索音乐曲目 没有猫或藤蔓或任何其他非音乐视频 我在 API Explorer 和文档中查找了有关此事的任何指示 但找不到任何有用的信息 如何只搜索音乐 是否还可以按发行年份或音乐流派过滤搜索结果
  • 如何使用邮递员查看返回的 html 呈现为网页

    我正在与邮递员一起测试 Flask 应用程序 我注意到 如屏幕截图所示 我收到了返回的 HTML 我知道过去我能够看到返回的 HTML 呈现为网页 但现在我不能 尽管单击各种按钮 如何将返回的 html 作为网页查看 In order to
  • 如何在 odoo 8 中导入 QOH

    我想通过 odoo 前端或使用后端 postgres 查询 更新 odoo 中的库存 我的股票价值保存在 csv 文件中 最后 我想批量更新现有数量 终于解决了 按照步骤操作即可 步骤1 1 gt 在仓库模块中选择产品 在列表视图中打开 2
  • 检测我们何时移回 Flutter 中的上一页

    我们从 Page1 移至 Page2 但现在从 Page2 移回 Page1 如下所示 Navigator of context pop 我们如何在 Page1 上检测到我们返回了 Navigator push context Materi
  • 使用 .NET 创建采用 JPEG 压缩的多页 TIFF

    有没有办法使用 NET 创建多页 TIFF 和 JPEG 压缩 我可以使用 LZW 压缩创建 TIFF 但文件非常大 好像EncoderValue枚举 我用来设置压缩 甚至没有合适的成员 你可以看看 gt gt 这篇文章 https sta
  • 这个查询可以安全地避免 SQL 注入吗?

    该脚本使用 PHP 编写 作为数据库 我使用 MySQL 这是脚本本身 unsafe variable GET user input sql sprintf INSERT INTO table column VALUES s unsafe
  • Drupal Studs 帮助我使用 form_alter 钩子(我就快到了)

    所以我认为我在概念上已经差不多了 但需要一些缺失的指导 目标是向普通用户注册表单添加一些字段 对其进行一些样式设置 然后将其提交并将额外的字段存储在表中 这是我到目前为止所拥有的 有人可以给我最后的推动并让我继续前进吗 请帮我 另外 如何应
  • Ionic2/Cordova typescript 项目中的 Moment.js 插件

    在我用 Typescript 编写的 Ionic 2 项目中 我使用 moment js 库 我使用代码片段导入它 import as moment from moment 这样做之后 在我的组件中我可以正常使用 moment 即 let
  • setlocale() 的用途是什么?

    我正在学习c 我发现了C 库的这个函数 setlocale http www cplusplus com reference clocale setlocale http www cplusplus com reference clocal
  • Caffe:如果内存中只能容纳一小部分,我该怎么办?

    我正在尝试训练一个非常大的模型 因此 我只能将非常小的批量大小放入 GPU 内存中 处理小批量的结果非常噪声梯度估计 https stackoverflow com a 33717093 1714410 我该怎么做才能避免这个问题 您可以更
  • PHP in_array() / array_search() 奇怪的行为

    我在使用 PHP 函数时发现了一些奇怪的行为in array 我有一个像这样的数组 arr TRUE some string something else 现在如果我想检查是否 test 显然不在数组中 但是in array 仍然返回 TR
  • 制作自定义 Android 闹钟以进行提醒

    我正在制作药物提醒应用程序 在该应用程序中 我添加了添加有关医生预约提醒的功能 在我的应用程序中 允许用户设置他 她自己的日期和时间 并且在该日期和时间应该触发警报 请帮助我 我已从此线程中参考 如何在Android中设置闹钟 https
  • 使用 mysql 选择 id 周围的行之前和之后

    我需要使用 mySQL 获取 ID 周围的 ID Example 表中ID 2 4 5 9 11 15 19 22 25 例如 我需要知道 ID 9 周围的 5 个 ID 查询应返回 4 5 9 11 15 Thanks 一个可能的解决方案
  • C++ 错误:“_mm_sin_ps”未在此范围内声明

    我正在尝试对将函数应用于数组的不同方法进行基准测试 why is mm sin ps在我的范围内不知道但是 mm sqrt ps is 我怎样才能让它知道 并且编译没有错误 include
  • 如何设置“react-native-drawer”在react-native中登录后仅对仪表板可见

    在反应本机中 我想禁用抽屉Login并启用抽屉 在Dashboard屏幕 我已经实施了 react native drawer with Navigator在路线之间导航 渲染方法如下 render
  • 如何使用触摸屏调用和关闭 Tkinter 制作的虚拟键盘

    我在打开和关闭使用 Tkinter 制作的虚拟键盘时遇到问题 我正在创建一个 GUI 用户将使用触摸屏显示器浏览它 并且用户需要输入条目 我试过了var name bind FocusIn callback 调用虚拟键盘并var name
  • 如何使用SVN、Branch?标签?树干? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我在谷歌上搜索了一下 找不到一个好的 初学者 指南SVN http en wikipedia org wiki Subversion
  • PostgreSQL 中的多个 DISTINCT ON 子句

    是否可以选择以下行DISTINCT ON一些单独的 独立的列集 假设我想要满足以下条件的所有行 明显于 name birth 明显于 name height 因此 在下表中 标有红叉的行不会有所不同 并指示失败的子句 name birth