计算以另一列中的值为条件的列中值的出现次数

时间:2017-07-05 12:46:38

标签: mysql sql mysql-workbench

我有一个包含三列的表:tasks,shift和worker_ID。任务中的任务可以由worker_ID中的多个worker执行。

   View view  = getLayoutInflater().inflate(R.layout.activity_main, null, false);
    imageView  = (ImageView) view.findViewById(R.id.image);

    setContentView(view);

我想创建一个sql查询来计算每个特定班次中每个worker_ID的出现次数,以返回以下附加列(num_occ):

tasks | shift | worker_ID
------|-------|----------
111   | 127   | 233
111   | 127   | 34
111   | 127   | 455
333   | 127   | 444
333   | 127   | 34
333   | 127   | 200
333   | 127   | 100
444   | 127   | 34
444   | 127   | 567
444   | 127   | 888
666   | 125   | 100
666   | 125   | 200
666   | 125   | 345
666   | 125   | 100
555   | 125   | 34
555   | 125   | 100
555   | 125   | 457

非常感谢任何帮助。 感谢

2 个答案:

答案 0 :(得分:1)

您可以使用变量轻松完成此操作:

 select t.*,
         (@rn := if(@ws = concat_ws(':', worker_id, shift), @rn + 1,
                    if(@ws := concat_ws(':', worker_id, shift), 0, 0)
                   )
         )
  from t cross join
       (select @rn := -1, @ws := '') params
  order by worker_id, shift;

答案 1 :(得分:0)

编辑:我错过了你使用mysql的事实;这个解决方案在MySQL中不起作用,因为MySQL不支持窗口函数;抱歉。

我相信你可以使用the OVER clause and a windowed function来实现你想要的结果。

SELECT tasks, [shift], worker_ID, 
    (ROW_NUMBER() OVER (PARTITION BY [shift], worker_ID ORDER BY tasks, [shift])) -1 AS num_occ
FROM Tasks
ORDER BY tasks;

我实际上并不了解您在示例中显示的输出表,但此代码确实实现了相同的结果。