gpt4 book ai didi

sql - 在 SQL (PostgreSQL) 中选择动态的几行

转载 作者:行者123 更新时间:2023-11-29 11:52:03 25 4
gpt4 key购买 nike

我的目标是制作动态的生产线组(实际上是按类型和颜色的产品)

我不知道只用一个选择查询是否可行。

但是:我想根据 number_per_group 列创建一组行(产品是一种类型和一种颜色),我想根据日期顺序(按日期排序)进行分组

NB_PER_GROUP 编号为 2 的单个产品从最终结果中排除。

Table :

-----------------------------------------------
NUM | TYPE | COLOR | NB_PER_GROUP | DATE
-----------------------------------------------
0 | 1 | 1 | 2 | ...
1 | 1 | 1 | 2 |
2 | 1 | 2 | 2 |
3 | 1 | 2 | 2 |
4 | 1 | 1 | 2 |
5 | 1 | 1 | 2 |
6 | 4 | 1 | 3 |
7 | 1 | 1 | 2 |
8 | 4 | 1 | 3 |
9 | 4 | 1 | 3 |
10 | 5 | 1 | 2 |


Results :

------------------------
GROUP_NUMBER | NUM |
------------------------
0 | 0 |
0 | 1 |
~~~~~~~~~~~~~~~~~~~~~~~~
1 | 2 |
1 | 3 |
~~~~~~~~~~~~~~~~~~~~~~~~
2 | 4 |
2 | 5 |
~~~~~~~~~~~~~~~~~~~~~~~~
3 | 6 |
3 | 8 |
3 | 9 |

如果你有其他方法解决这个问题,我会接受。

最佳答案

像这样的东西怎么样?

select max(gn.group_number) group_number, ip.num
from products ip
join (
select date, type, color, row_number() over (order by date) - 1 group_number
from (
select op.num, op.type, op.color, op.nb_per_group, op.date, (row_number() over (partition by op.type, op.color order by op.date) - 1) % nb_per_group group_order
from products op
) sq
where sq.group_order = 0
) gn
on ip.type = gn.type
and ip.color = gn.color
and ip.date >= gn.date
group by ip.num
order by group_number, ip.num

只有当您的 nb_per_group 值对于每种类型和颜色的组合都相同时,这可能才有效。它可能还需要唯一的日期,但如果需要,这可能会变通。

最里面的子查询按类型和颜色对行进行分区,按日期排序,然后计算行号对 nb_per_group 取模;这形成了一个基于 0 的组计数,每次超过 nb_per_group 时都会重置为 0。

下一级子查询找到我们在下一级子查询中映射的所有 0 值,并为它们分配组号。

最后,最外层的查询将产品表中的每一行与一个组号联系起来,该组号计算为在此产品日期之前拆分的最高组号。

关于sql - 在 SQL (PostgreSQL) 中选择动态的几行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22010986/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com