如何在 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
如何在 Laravel 8 中使用 JavaScript 获取?