如何在 Laravel 8 中使用 PostgreSQL 中的子查询通过 group by 子句获取行值?

Posted

技术标签:

【中文标题】如何在 Laravel 8 中使用 PostgreSQL 中的子查询通过 group by 子句获取行值?【英文标题】:how to get row value with group by clause using subquery in PostgreSQL in Laravel 8? 【发布时间】:2022-01-05 13:19:41 【问题描述】:

这是我的表,首先我想获得每个 MAX (date_sta)status_exec,然后我想按 status_exec 并获取 COUNT

id_out_sta status_exec date_sta
1 2 2021-11-07
1 1 2021-11-28
1 5 2021-12-07
2 7 2021-04-02
2 2 2021-05-12
2 6 2021-08-07
3 2 2021-08-05
3 5 2021-08-28
4 2 2021-03-15
4 5 2021-04-25

我期望的结果应该如下:

status_exec COUNT
5 3
6 1

这是我的查询,但没有帮助:

SELECT id_out_sta, status_exec , max(date_sta) as max_date_sta
FROM public.status_exe 
join public.order_out on status_exe.id_out_sta = order_out.id_out
group by (id_out_sta);

请提供任何建议,查询生成器简单查询。

【问题讨论】:

【参考方案1】:

一个常见的解决方案是row_number 窗口函数来查找每个组的最大值。在 CTE 中使用它,然后聚合结果:

with s as (
    select *,
      Row_Number() over(partition by id_out_sta order by max_date_sta desc) rn
    from t
)
select status_exec, Count(*) "Count"
from s
where rn=1
group by status_exec

Example DB<>Fiddle

【讨论】:

【参考方案2】:

使用DISTINCT ON 后跟子查询:

SELECT status_exec, COUNT(*) AS COUNT
FROM
(
    SELECT DISTINCT ON (status_exec) *
    FROM public.status_exe
    ORDER BY status_exec, max_date_sta DESC
) t
GROUP BY status_exec;

【讨论】:

【参考方案3】:

这里是另一个使用计数窗口函数的例子。

SELECT * FROM (
SELECT DISTINCT ON (id_out_sta)
    status_exec,
    count(*) over(partition by status_exec)
  FROM t
  ORDER BY id_out_sta, max_date_sta DESC
) as list
GROUP BY 1,2

小提琴是here

【讨论】:

以上是关于如何在 Laravel 8 中使用 PostgreSQL 中的子查询通过 group by 子句获取行值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Laravel 8 中使用 srmklive/laravel-paypal v3

如何在 Postgre 中返回主列名?

如何在 Laravel 8 中使用 JavaScript 获取?

如何在 Laravel 8 模块中使用 InertiaJS 加载 Vue 组件

如何在 Laravel 8 中解密 cookie

如何在 laravel 8 中使用 Cascade Soft Delete Trait?