Laravel在MySQL中获得A列每个月的最后一条记录和B列的总和值

Laravel在MySQL中获得A列每个月的最后一条记录和B列的总和值,mysql,laravel,Mysql,Laravel,我尝试在MySql数据库中使用Laravel 5.4获取列value和列volume的每个月的最后一条记录,我的数据库结构如下: id | volume | value | date ---+--------+-------+----------- 1 | 5 | 2 | 2020-01-01 2 | 1 | 3 | 2020-01-22 3 | 1 | 3 | 2020-02-02 4 | 3 | 1 | 2020

我尝试在MySql数据库中使用Laravel 5.4获取列
value
和列
volume
的每个月的最后一条记录,我的数据库结构如下:

id | volume | value | date
---+--------+-------+-----------
 1 | 5      |   2   | 2020-01-01
 2 | 1      |   3   | 2020-01-22
 3 | 1      |   3   | 2020-02-02
 4 | 3      |   1   | 2020-02-03
 5 | 2      |   4   | 2020-09-03
所以我需要的是 输出:

我所做的:

$data = DomesticMarket::select(DB::raw('SUM(volume) AS "volume", CONCAT(YEAR(`date`), "-", MONTH(`date`)) AS mydate, value AS "value", YEAR(`date`) AS gy, MONTH(`date`) AS gm'))
        ->whereBetween('date', [$start, $end])
        ->where('active', '1')
        ->groupBy('gy')
        ->groupBy('gm')
        ->groupBy('mydate')
        ->groupBy('value')
        ->orderBy('gy')
        ->orderBy('gm')
        ->get();

请告诉我这样检索结果的最佳方法。提前感谢..

我在SQL Server上测试了以下内容-我相信它可以在mySQL上运行-我不熟悉Laravel,但是您可以根据需要调整此查询。它的关键是使用Window函数(ROW_NUMBER()OVER(PARTITION BY…))。这使您可以按照日期值的顺序对嵌套查询中每个月的行进行排序(如果特定日期有多条记录,会发生什么情况??)

分区方法使用“YEAR()”和“MONTH()”将记录拆分为组。ORDER BY确保记录在每组中从最后一位到第一位(按[日期])排列。外部查询使用该秩([row]=1)获取每个月“最后一条”记录的[value]和[date]值。因此,[row]=1是每月[date]之前的最后一条记录

$data = DomesticMarket::select(DB::raw('SUM(volume) AS "volume", CONCAT(YEAR(`date`), "-", MONTH(`date`)) AS mydate, value AS "value", YEAR(`date`) AS gy, MONTH(`date`) AS gm'))
        ->whereBetween('date', [$start, $end])
        ->where('active', '1')
        ->groupBy('gy')
        ->groupBy('gm')
        ->groupBy('mydate')
        ->groupBy('value')
        ->orderBy('gy')
        ->orderBy('gm')
        ->get();
SELECT SUM(volume) [volume], MAX(CASE WHEN [row]=1 THEN value ELSE 0 END) [value], 
MAX(CASE WHEN [row]=1 THEN dt ELSE NULL END) [date]
FROM (
    SELECT volume, value, dt,  ROW_NUMBER() OVER(PARTITION BY YEAR(dt), MONTH(dt) ORDER BY dt DESC) row
    FROM TestValues
) src
GROUP BY YEAR(dt), MONTH(dt)
ORDER BY [date]