如何在 Laravel 8 中使用 PostgreSQL 中的子查询通过 group by 子句获取行值?
how to get row value with group by clause using subquery in PostgreSQL in Laravel 8?
这是我的table,首先我想获取每个MAXstatus_execstatus_exec =](date_sta) 然后我想按 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);
请提出任何建议,查询生成器或简单查询。
一个常见的解决方案是 row_number
window 函数来查找每个组的最大值。在 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
使用 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;
这是另一个使用计数 window 函数的例子。
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
Fiddle 是 here
这是我的table,首先我想获取每个MAXstatus_execstatus_exec =](date_sta) 然后我想按 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);
请提出任何建议,查询生成器或简单查询。
一个常见的解决方案是 row_number
window 函数来查找每个组的最大值。在 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
使用 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;
这是另一个使用计数 window 函数的例子。
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
Fiddle 是 here