代码之家  ›  专栏  ›  技术社区  ›  mauris

以数字模式/顺序返回结果集

  •  -1
  • mauris  · 技术社区  · 15 年前

    我手头有一个问题,那就是根据单个列的值以数字模式/序列获取结果集。

    假设我有下表:

    +-------+  
    | val   |  
    +-------+
    | 1     |
    | 1     |
    | 1     |
    | 1     |
    | 2     |
    | 2     |
    | 2     |
    | 2     |
    | 3     |
    | 3     |
    | 3     |
    | 3     |
    +-------+
    

    +-------+  
    | val   |  
    +-------+
    | 1     |
    | 2     |
    | 3     |
    | 1     |
    | 2     |
    | 3     |
    | 1     |
    | 2     |
    | 3     |
    | 1     |
    | 2     |
    | 3     |
    +-------+
    

    如果其中一个值不足以填补空白,那么预期的行为是什么?假设我们把3中的两个换成8

    +-------+  
    | val   |  
    +-------+
    | 1     |
    | 1     |
    | 1     |
    | 1     |
    | 2     |
    | 2     |
    | 2     |
    | 2     |
    | 3     |
    | 3     |
    | 8     |
    | 8     |
    +-------+
    

    +-------+  
    | val   |  
    +-------+
    | 1     |
    | 2     |
    | 3     |
    | 8     |
    | 1     |
    | 2     |
    | 3     |
    | 8     |
    | 1     |
    | 2     |
    | 1     |
    | 2     |
    +-------+
    
    1 回复  |  直到 15 年前
        1
  •  1
  •   O. Jones    15 年前

    这就是我们所说的少校 rownum 乱劈。假设您的表名为t,值列名为val,这将给出您要查找的结果。

    SELECT val    /* step 6 */
    FROM
    (SELECT A.val, 
       CASE 
       WHEN A.val <> IFNULL(B.val,-1) THEN @q:=0   /* step 4 */
       ELSE @q:=@q+1                               /* step 4 */ 
        END AS seq                                 /* step 4 */
       FROM
        (SELECT @q:=0)r,
        (SELECT                          /* step 1 */
                @a:=@a+1 AS n,           /* step 1 */
                val                      /* step 1 */
          FROM  (SELECT @a:= 0)r, T      /* step 1 */
         ORDER BY val) A                 /* step 1 */
       LEFT JOIN
        (SELECT                        /* step 2, like step 1 */
                @b:=@b+1 AS n, 
                val
           FROM  (SELECT @b:= 0)r, T
         ORDER BY val) B
        ON B.n = A.n-1    /* step 3 */
     ORDER BY seq,val) s  /* step 5 */
    

    1. 数量)

    2. 那我们需要两个,带着

    3. 那我们需要把他们联合起来 行=要比较的行1偏移 相邻val列。

    4. 然后我们需要应用一个序列 序号1,2,3到1,然后是2, 等。

    5. 然后我们需要按顺序排序 瓦尔。

    6. 那我们得把序列藏起来。

    瞧。。。。

    推荐文章