sql - 在 mysql 中聚合结果时选择最新的字符串

标签 sql mysql greatest-n-per-group aggregation

我的任务是生成一些关于我们的 Request Tracker 使用情况的报告。 Request Tracker是我工作的几个部门使用的票务系统。为此,我每晚将有关当天更改的票证的详细信息拍摄到另一个数据库中。这种方法将我的报告与 RT 使用的内部数据库模式分离。

在报告的许多其他问题中,我需要报告每个部门每个月解决了多少票。在 RT 中,部门存储为 CustomField,我的建模遵循该趋势,如您在下面的查询中所见。然而,由于我每晚都在抓取快照,一张票有多行,部门字段可能会在一个月内发生变化。我只对最近的 Department 字段感兴趣。我不知道如何在查询中获取它。

我知道我可以使用“GROUP BY”将我的查询结果减少到每张票一个,但是当我这样做时,我不知道如何获取最后一个部门设置。由于 Departments 都是字符串,因此 MAX() 不会得到最后一个。 MySQL 不要求您对您选择的字段使用聚合函数,但结果是不确定的(根据我的测试,它看起来可能会在我的 MySQL 版本上获取第一个)。

为了说明,这里是显示两张票的查询结果,以及所有部门字段设置:

"ticket_num","date","QueueName","CF","CFValue","closed"
35750,"2009-09-22","IT_help","Department","",""
35750,"2009-09-23","IT_help","Department","",""
35750,"2009-09-24","IT_help","Department","",""
35750,"2009-09-25","IT_help","Department","",""
35750,"2009-09-26","IT_help","Department","",""
35750,"2009-10-02","IT_help","Department","",""
35750,"2009-10-03","IT_help","Department","",""
35750,"2009-10-12","IT_help","Department","",""
35750,"2009-10-13","IT_help","Department","",""
35750,"2009-10-26","IT_help","Department","Conference/Visitors","2009-10-26 10:10:32"
35750,"2009-10-27","IT_help","Department","Conference/Visitors","2009-10-26 10:10:32"
36354,"2009-10-20","IT_help","Department","",""
36354,"2009-10-21","IT_help","Department","",""
36354,"2009-10-22","IT_help","Department","FS Students",""
36354,"2009-10-23","IT_help","Department","FS Students",""
36354,"2009-10-26","IT_help","Department","FS Students","2009-10-26 12:23:00"
36354,"2009-10-27","IT_help","Department","FS Students","2009-10-26 12:23:00"

如我们所见,两张工单都在 26 日关闭,两张工单首次出现时部门字段都空了几天。我在下面包含了我的查询,您可以看到我人为地限制了 where 语句后半部分返回的列数:

SELECT d.ticket_num, d.date, q.name as QueueName, cf.name as CF, cfv.value as CFValue, d.closed
FROM daysCF dcf
INNER JOIN daily_snapshots d on dcf.day_id = d.id
INNER JOIN Queues q on d.queue_id = q.id
INNER JOIN CustomFieldValues cfv on dcf.cfv_id = cfv.id
INNER JOIN CustomFields cf on cf.id = cfv.field_id
WHERE cf.name = 'Department' and (d.ticket_num = 35750 or d.ticket_num = 36354)
ORDER by d.ticket_num, d.date

我如何修改该查询,以便获得一个结果集,告诉我在 10 月份有一张“FS Students”关闭的工单和一张“Conference/Visitors”关闭的工单?

最佳答案

这是 Stack Overflow 上经常出现的“最大 n-per-group”问题。

以下是我在您的情况下的解决方法:

SELECT d1.ticket_num, d1.date, q.name as QueueName, 
  cf.name as CF, cfv.value as CFValue, d1.closed
FROM daysCF dcf
INNER JOIN daily_snapshots d1 ON (dcf.day_id = d1.id)
INNER JOIN Queues q ON (d1.queue_id = q.id)
INNER JOIN CustomFieldValues cfv ON (dcf.cfv_id = cfv.id)
INNER JOIN CustomFields cf ON (cf.id = cfv.field_id)
LEFT OUTER JOIN daily_snapshots d2 ON (d1.ticket_num = d2.ticket_num AND d1.date < d2.date)
WHERE d2.id IS NULL AND cf.name = 'Department'
ORDER by d1.ticket_num, d1.date;

关于sql - 在 mysql 中聚合结果时选择最新的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1635404/

相关文章:

php - 使用 PHP 确保添加到 MySQL 表的唯一性

mysql - 字段列表 Joomla 自定义组件中的未知列 'title'

mysql - 如何将登录参数传递给mysql

mysql - SQL 仅选择列上具有最大值的行

php - 使用 "JOIN"、 "WHERE"和 "IN"(mysql+php)

显示同一组中是否有两个用户的 SQL 查询

mysql - 如何获得每个类别的前 5 名

MySQL 选择 COUNT(*) 和具有最大日期的行

mysql - 如何在MySQL中选择某些列范围的所有最后一行

mysql - 只返回最后一行 LEFT JOIN