如何在postgresql中用另一个条件过滤选定的查询
how to filter selected query with another condition in postgresql
我有 table 如下
id | product_id | product_type_id | closing_stock | created_dttm
-------------------------------------------------------------------------
1 2 1 0 21-Nov-21
2 2 2 9 21-Nov-21
3 2 3 11 21-Nov-21
4 2 1 7 20-Nov-21
我需要获取具有唯一 product_id 和 product_type_id 按 created_dttm desc.
排序的最后或最近记录
所以我有以下查询,但由于 closing_stock param > 0,它没有获取最后或最近输入的数据。
select distinct on(product_id, product_type_id) *
from daily_stock
where product_id = 2
and product_type_id in (1, 2, 3)
and closing_stock > 0
order by product_id, product_type_id , created_dttm desc
id | product_id | product_type_id | closing_stock | created_dttm
-------------------------------------------------------------------------
1 2 2 9 21-Nov-21
2 2 3 11 21-Nov-21
3 2 1 7 20-Nov-21
但我期待以下结果
id | product_id | product_type_id | closing_stock | created_dttm
------------------------------------------------------------------------------------
2 2 2 9 21-Nov-21
3 2 3 11 21-Nov-21
WHERE
子句应用在DISTINCT ON
之前,过滤掉所有带有closing_stock = 0
的行。
因此,如果具有 closing_stock = 0
的任何行是 product_id
和 product_type_id
组合的最新行,则该组合不会从结果中排除。
从查询中删除条件 closing_stock > 0
并在获得结果后使用它:
select *
from (
select distinct on(product_id, product_type_id) *
from daily_stock
where product_id = 2 and product_type_id in (1, 2, 3)
order by product_id, product_type_id, created_dttm desc
) t
where closing_stock > 0;
或者,使用 row_number()
window 函数:
select *
from (
select *, row_number() over (partition by product_id, product_type_id order by created_dttm desc) rn
from daily_stock
where product_id = 2
) t
where rn = 1 and closing_stock > 0;
参见demo。
我有 table 如下
id | product_id | product_type_id | closing_stock | created_dttm
-------------------------------------------------------------------------
1 2 1 0 21-Nov-21
2 2 2 9 21-Nov-21
3 2 3 11 21-Nov-21
4 2 1 7 20-Nov-21
我需要获取具有唯一 product_id 和 product_type_id 按 created_dttm desc.
排序的最后或最近记录所以我有以下查询,但由于 closing_stock param > 0,它没有获取最后或最近输入的数据。
select distinct on(product_id, product_type_id) *
from daily_stock
where product_id = 2
and product_type_id in (1, 2, 3)
and closing_stock > 0
order by product_id, product_type_id , created_dttm desc
id | product_id | product_type_id | closing_stock | created_dttm
-------------------------------------------------------------------------
1 2 2 9 21-Nov-21
2 2 3 11 21-Nov-21
3 2 1 7 20-Nov-21
但我期待以下结果
id | product_id | product_type_id | closing_stock | created_dttm
------------------------------------------------------------------------------------
2 2 2 9 21-Nov-21
3 2 3 11 21-Nov-21
WHERE
子句应用在DISTINCT ON
之前,过滤掉所有带有closing_stock = 0
的行。
因此,如果具有 closing_stock = 0
的任何行是 product_id
和 product_type_id
组合的最新行,则该组合不会从结果中排除。
从查询中删除条件 closing_stock > 0
并在获得结果后使用它:
select *
from (
select distinct on(product_id, product_type_id) *
from daily_stock
where product_id = 2 and product_type_id in (1, 2, 3)
order by product_id, product_type_id, created_dttm desc
) t
where closing_stock > 0;
或者,使用 row_number()
window 函数:
select *
from (
select *, row_number() over (partition by product_id, product_type_id order by created_dttm desc) rn
from daily_stock
where product_id = 2
) t
where rn = 1 and closing_stock > 0;
参见demo。