zoukankan      html  css  js  c++  java
  • mysql

    初始化数据

    DROP TABLE IF EXISTS X;
    CREATE TABLE X(
        a INT UNSIGNED PRIMARY KEY,
        b CHAR(1) NOT NULL
        
    )ENGINE=INNODB;
    
    INSERT INTO X SELECT 3, 'a';
    INSERT INTO X SELECT 4, 'b';
    INSERT INTO X SELECT 6, 'c';
    INSERT INTO X SELECT 7, 'd';
    
    SELECT * FROM X;

    假设a列从1开始,对于当前表中的数据3、4、6、7,查询应该返回1。如果当前表中的数据位1、2、3、4、6、7,查询结果应该返回5。

    最小缺失值可以通过如下的表达式来解决:

    SELECT
    CASE
        WHEN NOT EXISTS(SELECT * FROM X WHERE a=1) THEN 1
        ELSE
        (.......... 返回最小缺失值的子查询 ..........)
    END AS missing;

    如果表中不存在列a的值为1的情况,则返回1,反则返回子查询的结果,该子查询返回最小缺失值。

    下面是通过子查询得到最小缺失值的过程:

    SELECT MIN(a)+1 AS missing
    FROM X A 
    WHERE NOT EXISTS(
        SELECT * FROM X B WHERE A.a+1=B.a
    );

    整个解决方案的sql如下:

    SELECT
    CASE
        WHEN NOT EXISTS(SELECT * FROM X WHERE a=1) THEN 1
        ELSE
        (SELECT MIN(a)+1 AS missing
            FROM X A 
            WHERE NOT EXISTS(
                SELECT * FROM X B WHERE A.a+1=B.a
            ))
    END AS missing;

    如果对表X执行上述语句会得到1。若按如下方式向类a插入值1和后后,重新运行结果,则会得到5。

    # 插入1、2
    INSERT INTO X SELECT 1, 'z';
    INSERT INTO X SELECT 2, 'x';

    对最小缺失值进行补缺操作

    INSERT INTO X
    SELECT
        CASE
            WHEN NOT EXISTS(SELECT * FROM X WHERE a=1) THEN 1
            ELSE
            (SELECT MIN(a)+1 AS missing
                FROM X A 
                WHERE NOT EXISTS(
                    SELECT * FROM X B WHERE A.a+1=B.a
                ))
        END AS missing, 'p';

  • 相关阅读:
    题解 DTOJ #1438. 矮人排队(lineup)
    题解 DTOJ #4423. 「THUSC2019」塔
    题解 DTOJ #4123.「2019冬令营提高组」全连
    题解 DTOJ #4016.辉夜的夜空明珠(moon)
    题解 DTOJ #2498.大步小步(babystep)
    题解 DTOJ #3326.组队(group)
    题解 DTOJ #1515.三塔合一
    题解 DTOJ #2305.Bazarek
    【code】Splay 模板
    寻找乱序数组中第K大的数
  • 原文地址:https://www.cnblogs.com/frank-quan/p/5843046.html
Copyright © 2011-2022 走看看