【问题标题】:Select dynamic couples of lines in SQL (PostgreSQL)在 SQL (PostgreSQL) 中选择动态行对
【发布时间】:2014-02-25 10:14:43
【问题描述】:

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

我不知道是否可以仅使用一个选择查询。

但是:我想根据 number_per_group 列创建一组行(A PRODUCT 是 TYPE 和 COLOR),并且我想根据日期顺序(Order By DATE)进行此分组

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   |

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

【问题讨论】:

  • GROUP = 0GROUP = 2有什么区别?
  • 第 2 组是产品的第 2 组 (1,1)。同一产品有多个组:第 0 组:第 1 组 (1,1),第 2 组:第 2 组 (1,1)。
  • 这看起来像是您应该在应用程序层中执行的操作,使用ORDER BY 遍历查询结果。 SQL 查询的结果是一个 relation,而您想要的输出根本不像是关系。
  • 所以我们同意,仅使用 SQL 查询是不可能有这个结果的。 (没有 PL/SQL)

标签: sql postgresql


【解决方案1】:

这样的事情呢?

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 为模计算行数;这为每次超过 nb_per_group 时重置为 0 的组形成基于 0 的计数。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-08
    • 2015-03-10
    • 2019-03-10
    • 2021-10-20
    • 1970-01-01
    • 2021-01-12
    • 2012-01-17
    相关资源
    最近更新 更多