用于计算相应条目的SQL语句,同时具有严格的序列(逻辑)

时间:2017-09-11 09:55:28

标签: mysql sql

我希望在保留序列的同时汇总生产计划中(相同)部分的数量。

我的表格如下:

-------------------------------------------------
|Part Number | Production Sequence Number | .... |
-------------------------------------------------
|           1|                           1| .... |
--------------------------------------------------
|           1|                           2| .... |
--------------------------------------------------
|           2|                           3| .... |
--------------------------------------------------
|           2|                           4| .... |
--------------------------------------------------
|           1|                           5| .... |
--------------------------------------------------

我需要连续计算相同零件的数量:

预期结果:

-------------------------------------------------
|Part Number | Nr of pieces in a row      | .... |
-------------------------------------------------
|           1|                           2| .... |
-------------------------------------------------
|           2|                           2| .... |
-------------------------------------------------
|           1|                           1| .... |
-------------------------------------------------

这可以通过unsing SQL(MySQL)来完成吗?

3 个答案:

答案 0 :(得分:0)

这在MySQL中很棘手。一种方法是使用相关子查询来定义组。您可以通过计算当前行之前与该行上的部件号不同的部件号的数量来定义组。这唯一标识组:

data_dict

我应该注意,为此目的,您将在大多数数据库中使用窗口函数。使用相关子查询是因为MySQL缺乏这一重要功能。

答案 1 :(得分:0)

我喜欢这个让我搜索和发现新事物的问题,我已经有了想要让它成为现实的想法,关于这个想法很简单:

  • 合并所有行(11221
  • 使用分隔符(11,22,1
  • 分隔数字的每个差异
  • 使用此分隔符([11, 22, 1]
  • 拆分
  • 计算每个部分的长度(2,2,1

PostgreSQL解决方案:

我已经解决了PostgreSQL中的问题我认为有办法将其翻译成MySQL语法

SELECT
   SUBSTRING(regexp_split_to_table(regexp_replace(array_to_string(array_agg(part), ''), '((\d)\2+)', '\1,', 'g'), ','), 1, 1) as part_number,
   length(regexp_split_to_table(regexp_replace(array_to_string(array_agg(part), ''), '((\d)\2+)', '\1,', 'g'), ',')) as production_sequence_number 
FROM
   mytable

输出

result

答案 2 :(得分:0)

您可以使用变量来模拟数字,然后执行GROUP BY

SELECT id, COUNT(*)
FROM
(
    SELECT 
        @row_number:=CASE
            WHEN @seq_num = id THEN @row_number
            ELSE @row_number + 1
        END AS num,
        @seq_num:=id as id,
        seq_num
    FROM tab, (SELECT @row_number:=0, @seq_num := 1) t
    ORDER BY seq_num
) t
GROUP BY num, id

demo