基于一个字段的不同记录在基于rails4中的另一个字段分组后没有列出

Posted

技术标签:

【中文标题】基于一个字段的不同记录在基于rails4中的另一个字段分组后没有列出【英文标题】:distinct records based on a field is not listing after grouping based on another field in rails4 【发布时间】:2018-09-20 07:25:26 【问题描述】:

我有一个查询来列出基于 project_parent_id 字段的唯一记录。记录应根据最后更新时间列出。也就是说,对于一个 project_parent_id,一天只能出现一条记录。

使用的查询是:

Project.unscoped.group("updated_at,project_parent_id,id").select("distinct project_parent_id,id,updated_at").order(updated_at: :desc).where('Date(projects.updated_at)>=? and Date(projects.updated_at)<=? and projects.last_modified_by=? and projects.project_parent_id is not ?', start_date, end_date, user_id,nil)

得到的结果是:

项目:0x0000000bd2a568 id:2973,updated_at:2018 年 9 月 19 日星期三 10:03:27 UTC +00:00,project_parent_id:2966,

项目:0x0000000bd2a400 id:2972,updated_at:2018 年 9 月 19 日星期三 09:45:03 UTC +00:00,project_parent_id:2964,

项目:0x0000000bd2a298 id:2971,updated_at:2018 年 9 月 19 日星期三 09:44:30 UTC +00:00,project_parent_id:2966

但是,结果中没有预期的最后一条记录。最后一条记录和第一条记录的project_parent_id是一样的:2966,只有前两条记录就够了。

你能帮忙吗?

【问题讨论】:

【参考方案1】:

您正在选择“project_parent_id,id,updated_at”的不同组合。返回最后一条记录是因为 project_parent_id 与第一条记录中的不同。正如你所说的

意思是,一天只能出现一条记录,对于一个 project_parent_id。

所以你的结果集中没有错误。

【讨论】:

最后一条记录和第一条记录相同project_parent_id: 2966 项目:0x0000000bd2a568 id:2973,更新时间:周三,2018 年 9 月 19 日 10:03:27 UTC +00:00,project_parent_id:2966 项目:0x0000000bd2a400 id:2972,更新时间:2018 年 9 月 19 日星期三 09:45:03 UTC +00:00,project_parent_id:2964,Project:0x0000000bd2a298 id:2971 更新时间:2018 年 9 月 19 日星期三 09:44:30 UTC +00 :00, project_parent_id: 2966【参考方案2】:
Project.unscoped.group("updated_at,project_parent_id,id")
                .select("project_parent_id, id, updated_at")
                .order(updated_at: :desc)
                .where("Date(projects.updated_at)>= ? AND Date(projects.updated_at)<= ?", start_date, end_date)
                .where("projects.last_modified_by = ? AND projects.project_parent_id != ?", user_id, nil).uniq

【讨论】:

对不起。得到了相同的结果。【参考方案3】:

使用DISTINCT ONproject_parent_id 获取每个组的第一行,从updated_at 获取日期。

Project.unscoped
  .group("DATE(updated_at), project_parent_id, id")
  .select("DISTINCT ON (project_parent_id, DATE(updated_at)) project_parent_id, id, updated_at")
  .order(updated_at: :desc)
  .where('Date(projects.updated_at)>=? and Date(projects.updated_at)<=? and projects.last_modified_by=? and projects.project_parent_id is not ?', start_date, end_date, user_id, nil)

【讨论】:

以上是关于基于一个字段的不同记录在基于rails4中的另一个字段分组后没有列出的主要内容,如果未能解决你的问题,请参考以下文章

Django 模型字段默认基于同一模型中的另一个字段

基于 Azure 流分析 T-SQL 查询中的另一个参数动态拆分参数

如何根据数据库中的另一个变量存储不同自增的ID

Rails 4:如何在 Rails 中使用 JQuery 禁用基于复选框值的文本字段

SQL记录-PLSQL记录

基于同一表上的另一个查询过滤记录的 SQL