将行计数结束

时间:2012-08-27 12:48:57

标签: mysql

 id      date     group n1  n2  n3  n4  n5
18853   1945-01-05  BA  87  34  1   59  50
18854   1945-01-13  BA  6   66  1   16  48 <= the last 16, 7 rows to the end
18855   1945-01-20  BA  38  14  24  78  36
18856   1945-01-27  BA  49  30  87  15  65 <= the last 49, 5 rows to the end
18857   1945-02-03  BA  30  64  36  5   32
18858   1945-02-10  BA  15  36  37  86  31 <= the last 36, 3 rows to the end
18859   1945-02-17  BA  86  78  69  7   60 <= the last 86, 2 rows to the end
18860   1945-02-24  BA  83  7   72  88  19 <= the last 7, 1 row to the end
18861   1945-03-03  BA  47  20  77  73  30 <= the last 47, 0 rows to the end

我有上表(按ID排序,但我打算按日期订购)。有没有办法获取指定数字和mySql中最后一行之间的行数? 请注意,某些数字会重复两次或更多次。该脚本应使用最低行。 这是mySQL应该输出的表:

Number|Rows count to the end
16|7
7|1
86|2
49|5
47|0
36|3

查询应搜索列n1,n2,n3,n4,n5并选择最接近结尾的值,并将剩余的行计数到结尾。 谢谢;)

2 个答案:

答案 0 :(得分:1)

假设您的未命名列的命名如下:

c1      c2          c3  c4  c5  c6  c7  c8
18853   1945-01-05  BA  87  34  1   59  50
18854   1945-01-13  BA  6   66  1   16  48
18855   1945-01-20  BA  38  14  24  78  36
18856   1945-01-27  BA  49  30  87  15  65
18857   1945-02-03  BA  30  64  36  5   32
18858   1945-02-10  BA  15  36  37  86  31
18859   1945-02-17  BA  86  78  69  7   60
18860   1945-02-24  BA  83  7   72  88  19
18861   1945-03-03  BA  47  20  77  73  30

此外假设c1是你的PK索引列,而c7列是你感兴趣的那个,下面可能会给你你想要的东西:

select t1.c7, MAX(t1.c1), (select count(*)
              from table t2
              where MAX(t1.c1) < t2.c1) as rowsToEnd
from table t1
group by t1.c7

好的,在理解了你想要的东西之后,以下内容可以给你你想要的东西:

编辑:在阅读了Imre L'的回答后,我意识到我完全忘记了IN操作符,所以这是更优雅的解决方案:

再次编辑:阅读了您的问题更新后。 这假设c4,c5,c6,c7,c8中的一个包含任何一行中出现的所有数字:

select distinct t3.c4, ( select count(*) AS RowsToEnd
                         from table t1
                         where t1.c1 > ( select max(t2.c1)
                                         from table t2
                                         where t3.c4 IN 
                                         (t2.c4, t2.c5, t2.c6, t2.c7, t2.c8)
                        )
from table t3

答案 1 :(得分:0)

假设数字列是名称n1..n6

使用16作为示例编号

select count(1) 
  from tablename 
 where date > (select date 
               from tablename 
              where 16 in (n1,n2,n3,n4,n5,n6) 
              order by date desc
              limit 1)

如何重新安排日期?