Rails - 连接后 Distinct ON

2023-11-27

我正在使用 Rails 4.2 和 PostgreSQL。我有一个Product模型和一个Purchase模型与Product has many Purchases。我想找到最近购买的独特产品。最初我尝试过:

Product.joins(:purchases)
.select("DISTINCT products.*, purchases.updated_at") #postgresql requires order column in select
.order("purchases.updated_at DESC")

然而,这会导致重复,因为它试图找到该对 (product.id and purchases.updated_at) 具有独特的价值。但我只想选择具有独特性的产品id加入后。如果某个产品 ID 在连接中多次出现,则仅选择第一个。所以我也尝试过:

Product.joins(:purchases)
.select("DISTINCT ON (product.id) purchases.updated_at, products.*")
.order("product.id, purchases.updated_at") #postgres requires that DISTINCT ON must match the leftmost order by clause

这不起作用,因为我需要指定product.id in the order条款因为this输出意外顺序的约束。

实现这一目标的 Rails 方法是什么?


因此,在@ErwinBrandstetter 答案的基础上,我终于找到了正确的方法。查找最近购买的不同商品的查询是

SELECT *
FROM  (
   SELECT DISTINCT ON (pr.id)
          pu.updated_at, pr.*
   FROM   Product pr
   JOIN   Purchases pu ON pu.product_id = pr.id
   ) sub
ORDER  BY updated_at DESC NULLS LAST;

The order_by子查询内部不需要,因为我们无论如何都在外部查询中排序。

执行此操作的 Rails 方法是 -

inner_query = Product.joins(:purchases)
  .select("DISTINCT ON (products.id) products.*, purchases.updated_at as date") #This selects all the unique purchased products.

result = Product.from("(#{inner_query.to_sql}) as unique_purchases")
  .select("unique_purchases.*").order("unique_purchases.date DESC")

@ErwinBrandstetter 建议的第二种(也是更好的)方法是

SELECT *
FROM   Product pr
JOIN  (
   SELECT product_id, max(updated_at) AS updated_at
   FROM   Purchases 
   GROUP  BY 1
   ) pu ON pu.product_id = pr.id
ORDER  BY pu.updated_at DESC NULLS LAST;

可以用 Rails 写成

join_query = Purchase.select("product_id, max(updated_at) as date")
  .group(1) #This selects most recent date for all purchased products

result = Product.joins("INNER JOIN (#{join_query.to_sql}) as unique_purchases ON products.id = unique_purchases.product_id")
  .order("unique_purchases.date")
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rails - 连接后 Distinct ON 的相关文章

  • 在 Oracle 中使用触发器记录对表的更改

    我的一门课有一个项目 当我们的两个表发生更改时 我们需要创建一个日志 插入 更新 删除 我们需要使用Oracle触发器和PL SQL 在日志文件中 我们需要记录用户ID 日期时间 IP地址和事件 插入 更新 删除 我知道如何设置触发器 但我
  • simple_fields_for 没有出现 [rails 4]

    我正在尝试创建两个隐藏字段 其中一个显示没有问题 但来自嵌套表单的另一个则没有 产品 rb class Product lt ActiveRecord Base has many product options dependent dest
  • A has_many Bs 其中 B 没有主键

    我有型号 A 和 B A has many B 并且 B 属于 A 到目前为止 一切都很好 除了我指定 B 没有主键 我不打算修改或删除单个 B 行 并且我预计会有数百万到数十亿的 B 行 因此省略主键将非常方便 节省空间 创建 B 表的迁
  • PreparedStatement setnull方法中Types.INTEGER和Types.NULL的区别

    下面的说法有什么区别 PreparedStatement setNull 1 java sql Types NULL and PreparedStatement setNull 1 java sql Types INTEGER 第一个指示驱
  • SQL Server 查询结果集的大小

    SQL Server 中是否有确定结果集中 Mgmt Studio 查询中返回的数据大小 以 MEGS 为单位 您可以打开客户端统计信息 查询菜单 包括客户端统计信息 它给出执行查询时从服务器返回的字节数
  • 在 postgresql 9.4 或 9.5 中查询 json 对象的嵌套数组中的元素

    studentID 1 StudentName jhon Data schoolname school1 enrolmentInfo year 2015 info courseID csc213 school IT enrollmentda
  • pq:无法调整共享内存段的大小。设备上没有剩余空间

    我在仪表板上有许多面板 数量约为 6 个 用于显示数据点图表 对 PostgreSQL 数据库的 Dockerized 实例进行查询 直到最近 面板都工作正常 有些面板停止工作并报告如下错误 pq 无法将共享内存段 PostgreSQL 2
  • SQL - 为每条记录调用存储过程

    我正在寻找一种方法来为 select 语句的每条记录调用存储过程 SELECT SomeIds SELECT spro Id FROM SomeTable as spro INNER JOIN Address addr ON addr Id
  • 如何使用 AngularJS、Devise 和 UI Router 全局实现身份验证?

    我对 Angular 很陌生 所以这可能是一个新手问题 我正在尝试实现一个简单的任务管理器 只是一个练习 以 Rails 作为后端 以 Angular 作为前端 到目前为止 我遵循了教程 一切正常 现在我想在全球范围内实施身份验证 这意味着
  • 如何生成devise gem的注册控制器

    我已经设置了 Devise 我已经在 user rb 文件中设置了以下代码 def self create auto password generated password Devise friendly token first 8 sel
  • 为什么安装 Ruby 1.9.3 时会出现 404 错误?

    我最近擦除了我的计算机 操作系统 Mac OS X 10 6 8 并重新安装了所有开发工具 我再次安装了RVM 但是 它不允许我安装 Ruby 1 9 3 到目前为止我已经尝试过 rvm install 1 9 3 rvm install
  • i18n:特定型号的错误消息本地化

    我可以为每个验证本地化错误消息 但如何为特定模型创建错误 普通的语言环境如下所示 en mongoid errors messages taken It is already taken 但我想更改消息user model en mongo
  • SQL Server 转换选择一列并将其转换为字符串

    是否可以编写一条从表中选择列并将结果转换为字符串的语句 理想情况下 我希望有逗号分隔的值 例如 假设 SELECT 语句看起来像这样 SELECT column FROM table WHERE column lt 10 结果是一列包含值的
  • 如何通过循环变量在 dbt 中多次运行 SQL 模型?

    我有一个 dbt 模型 测试模型 接受地理变量 zip state region 在配置中 我想通过循环变量来运行模型三次 每次使用不同的变量运行它 问题是 我有一个如下所示的宏 它将变量附加到输出表名称的末尾 即运行测试模型 with z
  • 在 Rails 中,我可以通过委托方法订购查询吗?

    我在通过委托方法订购查询时遇到困难 我的任务是帮助将一个相当大的 Rails 3 应用程序升级到 Rails 4 我在索引操作中遇到了这个查询 我知道这些对象的命名是可怕且令人困惑的 measurements controller rb d
  • 将多行合并为一行并根据行数附加列

    我正在尝试将同一个表的多行合并为一个 我有一个像这样的示例表 Col1 Col2 Col3 Col4 Col5 Col6 1 BH1 CB 12 CC CC Conveyor Mal 1 BH1 CB 104 ZC ZC Full Emp
  • 外键引用多个表

    我有4张桌子 A ida name B ida B specific stuff C ida C specific stuff D ida D specific stuff 我希望另一个表 E 可以仅引用 B 或 C 而不是 D 我可以在其
  • 累计非重复计数

    我正在查询每天获取 uid 的累计不同计数 示例 假设有 2 个 uid 100 200 出现在日期 2016 11 01 并且它们也在第二天出现 新的 uid 300 100 200 300 出现在 2016 11 02 此时我希望商店累
  • 如何在动态查询中将行值连接到列名

    我正在开发一个允许配置问题和答案的应用程序 目前最多可以有 20 个答案 但也可能更少 我的结构如下 问题 ID FormId QuestionText AnswerField 1 1 Name Answer01 2 1 Address A
  • 让 Prometheus 发送 SQL 查询

    我正在尝试使用普罗米修斯 https prometheus io 监视我的 MySQL 数据库 但似乎找不到添加 SQL 查询的区域 例如 我想运行一个返回值的 SQL 查询 然后将该值添加到图表中 发送警报 有没有办法让 Promethe

随机推荐

  • 在 Polymer 和 Dart 中将内容标签渲染为模板的一部分

    我希望使用聚合物和飞镖制作一个通用列表 我正在扩展 UL 元素来做到这一点 我想将模板变量放置在此自定义元素的内容中 ul li item first name li ul 自定义元素
  • 如何在imshow中绘制单元格边框

    我有一个小的 2d 矢量要显示 import matplotlib pyplot as plt import numpy as np img np random rand 4 10 plt imshow img cmap Reds 如下 但
  • golang如何实时测试http服务器?

    我使用 gotests 和 gorilla mux 并且我可以对我的 http handlerfunc 处理程序进行单元测试 但它们不会响应正确的 http 请求方法 因为它们应该在 gorilla mux 下响应 我如何进行 实时服务器
  • Pandas:计算组上的时间间隔交叉点

    我有以下形式的数据框 import pandas as pd Out 1 df pd DataFrame id 1 2 3 4 5 group A A A B B start 2012 08 19 2012 08 22 2013 08 19
  • Jenkins:允许本地结账

    这是我第一次使用詹金斯 我创建了一个只有一个文件的新文件夹 并在其中创建了一个 git 存储库 然后我使用该存储库设置 Jenkins 我现在得到的是这个错误 错误 Git 远程 path hello 的签出已中止 因为它 引用本地目录 这
  • 使用 CodeIgniter 更新批次

    我正在尝试使用 CodeIgniter 制作一个小型开放式 CMS 现在正在研究类别系统 我真的很困惑 经过多次尝试和论坛帖子后我没有解决它 我有 2 个 mySQL 表 1 ft categories 列出所有类别的名称 包含 2 个字段
  • 如何在 Laravel 中创建临时表

    如何在laravel中创建临时表 插入记录并检索 你好 我正在尝试在 laravel 中创建一个临时表并插入一条记录并从临时表中检索该记录 然后删除该表 但我的临时表没有创建 DB raw CREATE TEMPORARY TABLE tb
  • Spring Data JPA“OR”与单个参数

    是否可以有一个像这样的 Spring Data JPA 存储库方法 User findByEmailOrUserName String usernameOrEmail 上面的方法名称不起作用 因为 Spring Data JPA 在尝试查找
  • 如何在 Ruby 中递增/递减一个字符以获取所有可能的值?

    我有一个长度为一个字符的字符串 可以是任何可能的字符值 irb main 001 0 gt x0 gt u0000 我认为这可能有效 irb main 002 0 gt x0 1 SyntaxError irb 2 syntax error
  • v-for 项目内部的切换会影响整个列表,如何使每个切换仅影响包含的列表项目?

    我正在使用 v for 循环制作一个项目列表 在循环的每个项目内都有一个带有单击事件方法的按钮 显示描述文本 当我单击按钮时 它应该仅在其自己的项目内部切换 但它会影响 v for 列表中的所有元素 那么 如何制作一个只影响其自身项目的切换
  • 在windows上安装scipy时出错

    我正在 Windows 机器和 2 7 版本的 python 上工作 我已经安装了 numpy 现在我正在尝试安装 scipy 我尝试使用简易安装命令并下载 zip 文件然后运行 setup py 文件来安装它 当我尝试通过 easy in
  • 如何在 Cordova Android 应用程序中嵌入 Youtube 视频

    我是 Cordova 应用程序开发的新手 我有一个 Youtube URL 我想将视频嵌入到 Cordova 应用程序中 我尝试过使用 YouTube Api JS 库 和 iframe 来制作它 我需要做什么才能在 Android 应用程
  • Chrome iFrame 阻止 HTTPS 重定向

    我有一个父网站 https a company com 其中包含一个带有 HTTPS 内容的 iframe https b company com foo 到目前为止一切都很顺利 但是 当发生重定向以在同一域上加载不同的路由时 Chrome
  • 如何使用 OpenGL 3.x VBO 渲染动态世界?

    尽管 OpenGL 3 x 本身的最新参考文献似乎很少 但 OpenGL 的实际低级操作相对简单 然而 我在试图概念化如何操纵 VBO 来渲染动态世界时遇到了严重的困难 显然旧的立即模式方式不适用 但是从那里我该去哪里呢 我是否编写某种场景
  • 单例模式的替代方案?

    我使用 ASP NET 和 C 担任 Web 开发人员已经有一段时间了 我想尝试通过使用最佳实践来提高我的技能 我有一个网站 我想一次性加载设置 然后在需要的地方引用它 所以我做了一些研究 50 的开发人员似乎正在使用单例模式来做到这一点
  • 如何通过用户的XAML动态添加控件到UserControl?

    我想创建一个包含 TextBlock 和 StackPanel 的用户控件 该控件将允许用户在 XAML 中动态地将他 她自己的控件添加到用户控件 以下是我的 UserControl 的示例 XAML
  • 如何从进程 ID 获取 X11 窗口?

    在 Linux 下 我的 C 应用程序使用 fork 和 execv 来启动 OpenOffice 的多个实例 以便查看一些 powerpoint 幻灯片 这部分有效 接下来 我希望能够将 OpenOffice 窗口移动到显示屏上的特定位置
  • 使用 NumPy datetime64 进行矢量化年/月/日运算

    我想从年 月和日的一维向量创建 NumPy datetime64 对象的向量 并且还可以反向操作 即从每日 datetime64 向量中提取年 月或日的向量 我正在使用 NumPy 1 7 0b2 例如 假设 years 1990 1992
  • 使用 RxJava 和 Retrofit 链接两个 Web 服务调用

    我正在使用 RxJava 和 Retrofit 我的基本要求是 我想链接两个 api 调用 这将被一个接一个地调用 从第一个 api 收到的响应在调用第二个 api 时用作输入 在阅读了互联网上的一些内容后 我用平面图来实现这一点 在执行此
  • Rails - 连接后 Distinct ON

    我正在使用 Rails 4 2 和 PostgreSQL 我有一个Product模型和一个Purchase模型与Product has many Purchases 我想找到最近购买的独特产品 最初我尝试过 Product joins pu