Sql 按日期选取最后一行分组
我需要按日期选择内容统计组 以下是记录示例:Sql 按日期选取最后一行分组,sql,query-builder,Sql,Query Builder,我需要按日期选择内容统计组 以下是记录示例: id cid viewCount created_at 1 1 50 31-12-2018 18:00:00 2 1 50 01-01-2019 18:00:00 3 2 50 01-01-2019 18:00:00 4 2 100 01-01-2019 19:00:00 5 2 150 01-01-2019 20:00:00 6 3 1
id cid viewCount created_at
1 1 50 31-12-2018 18:00:00
2 1 50 01-01-2019 18:00:00
3 2 50 01-01-2019 18:00:00
4 2 100 01-01-2019 19:00:00
5 2 150 01-01-2019 20:00:00
6 3 1000 01-01-2019 15:00:00
需要返回:
id cid viewCount date
1 1 50 31-12-2018
2 1 50 01-01-2019
5 2 150 01-01-2019
6 3 1000 01-01-2019
我尝试了以下代码
$qb = $this->createQueryBuilder('c');
$qb->select('a.id as id')
->addSelect('COALESCE(SUM(a.viewCount),0) as viewCount')
->addSelect('DATE_FORMAT(a.createdAt, \'%d-%m-%Y\') as date');
->innerJoin('c.analytics', 'a')
->groupBy('c.cid')
->addGroupBy('date')
->orderBy('a.createdAt', 'ASC');
返回:
id cid viewCount date
1 1 50 31-12-2018
2 1 50 01-01-2019
3 2 50 01-01-2019
4 2 100 01-01-2019
5 2 150 01-01-2019
6 3 1000 01-01-2019
我已尝试创建子查询:
$qbLastHour = $this->createQueryBuilder('cc');
$qbLastHour->select('MAX(DATE_FORMAT(aa.createdAt, \'%H\'))')
->innerJoin('cc.analytics', 'aa')
->where('cc.id=c.id')
->groupBy('cc.cid')
->addGroupBy('s');
$qb->addSelect(sprintf("(%s) AS r", $qbLastHour->getDQl()));
但是出现了一些问题,因为我没有在子查询中按日期分组
如果有人能帮我。谢谢你更新
这里再次尝试在sql中,根据每天的最大时间,每个日期只选择一行和cid
SELECT id, c.cid, viewCount, max_date
FROM content a
JOIN content_analytic c ON a.id = c.content_id
RIGHT JOIN (SELECT c.cid, DATE_FORMAT(created_at, '%d-%m-%Y') dt, MAX(created_at) max_date
FROM content a
JOIN content_analytic c ON a.id = c.content_id
GROUP BY dt, c.cid) x ON x.max_date = a.created_at and x.cid = c.cid
这就是我认为在纯sql中查询的方式
SELECT c.cid, COALESCE(SUM(a.viewCount), 0), DATEFORMAT(a.created_at, ‘%d-%m-%Y’) as date
FROM content a
INNER JOIN content_analytic c ON a.id = c.content_id
GROUP BY c.cid, date
ORDER BY date
不要按id分组。@clinomaniac谢谢你的回答我犯了一个错误我编辑了这篇文章。我需要按contentId cid分组你在什么上加入?@JoakimDanielson我从我的内容中选择,并在content\u analysis上加入内容分析。content\u id=content.idOk,很难理解真正的sql问题是什么。为什么您要更改预期结果,以便将时间包括在内,而这些值为什么不能相加?谢谢您的帮助。你不按小时过滤吗?我需要约会的最后几个小时。你说的“按小时过滤”是什么意思?您的查询中没有WHERE子句?例如,我的示例中的id 3,4,5。只需返回id即可=5@Spawnrad这就是我的代码所做的,因为不包括a.id。我猜你在用MySql?哦,我知道我在努力