在分组语句

时间:2017-07-19 06:23:29

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

我有一个发票系统,我正在尝试生成花费的时间报告。我将每个更改实例保存到订单中,因此每张发票上几乎每个项目都有多个条目。因此,我会过滤掉旧的更改,并尝试仅使用最新的更改。

共享project_id,phase_id和同一周开始的每个实例都是发票上的相同项目。我想生成一个报告,只抓取这些项目的最新版本。

示例表:

    id       project_id      phase_id        weekstart     created
    ---------------------------------------------------------------
    1        6               apple         2017-04-20    2017-04-23
    2        6               apple         2017-04-20    2017-04-24
    3        8               banana        2017-04-20    2017-04-23
    4        9               pear          2017-04-20    2017-04-23
    5        9               pear          2017-04-20    2017-04-25

我希望能够运行查询来获取:

    id       project_id      phase_id        weekstart     created
    ---------------------------------------------------------------
    2        6               apple         2017-04-20    2017-04-24
    3        8               banana        2017-04-20    2017-04-23
    5        9               pear          2017-04-20    2017-04-25

目前我使用的是:

SELECT * from invoiceitems where employee_id = 10 
group by project_id, phase_id, weekstart 

但这并不能说明创作日期。

对结果进行排序对group by语句没有任何影响。我已经检查了类似的帖子,但我发现只有两个人想要按最高创建日期排序,或者不按多列对结果进行分组。

2 个答案:

答案 0 :(得分:1)

加入子查询,查找每个项目的最新创建时间。请注意,我们在此处使用GROUP BY,但仅在子查询中使用,以汇总项目。

SELECT t1.*
FROM invoiceitems t1
INNER JOIN
(
    SELECT project_id, phase_id, MAX(created) AS max_created
    FROM invoiceitems
    GROUP BY project_id
) t2
    ON t1.project_id = t2.project_id AND
       t1.phase_id   = t2.phase_id
       t1.created    = t2.max_created

答案 1 :(得分:-2)

经过测试并完美运作

SELECT MAX(`id`) as `id`, `project_id`, `phase_id`, 
`weekstart`, MAX(`created`) as `created` 
FROM `invoiceitems` 
GROUP BY `project_id` 
ORDER BY `project_id` ASC