• 不利用聚合函数MAX求最大值


    这个问题是从书上看来的,觉得方法不错就部分摘抄下来了。
     
    根据下面的SQL数据表:
    T_Number (
        num INT
    )
    
    请写一条SQL语句,返回 num 的最大值,不能使用汇总功能(MAX、MIN等)。
    先给出一个示例数据表以便更好的进行思考:
      
    为了方便方便起见,我把建表的SQL语句也贴出来,这样您就可以您自己的SQL Server上快速地建立起同样的数据表。
    CREATE TABLE
        T_Number (
            num int
        );
    
    INSERT INTO T_Number(num) VALUES(5);
    INSERT INTO T_Number(num) VALUES(23);
    INSERT INTO T_Number(num) VALUES(-6);
    INSERT INTO T_Number(num) VALUES(7);
    
    在这些示例数据中,您需要打印出23。其他数据都小于23。这虽然不错,但无助于想出SQL语句。换一种类似的说法,23是唯一一个没有比它自己大的数,这种说法更有用。如果您能返回没有别的值比它大的数,那就只返回23,这样问题就解决了。这句话比较拗口,我们可以这样说,先得到比23小的数值,然后再返回没在这堆数值里出现过的数,显然,这个数就是23。
     
    首先,您需要弄清楚哪些数比它小。这个查询比较好办。先让这个表自关联,创建所有可能的数值对,其中一列数值比另一列的小,这个查询如下:
    SELECT Lesser.num,Greater.num
            FROM T_Number AS Lesser, T_Number AS Greater
            WHERE Lesser.num < Greater.num;
    
     
    利用示例数据,将得到下表结果:
    正如我们所期望的,所有比23小的值都在Lesser字段中。因此,如果您将前面的查询作为一个子查询,然后选择不再其中的值,就可以得到最大值。这个查询如下:
    SELECT num FROM T_Number WHERE num NOT IN
        (SELECT Lesser.num 
            FROM T_Number AS Lesser, T_Number AS Greater
            WHERE Lesser.num < Greater.num);
    
    这个查询有一个小缺陷。如果最大值在T_Number表中是重复的,它将返回两次以上。要防止这一点,就要使用DISTINCT关键之。这项改动是的查询变为:
    SELECT DISTINCT num FROM T_Number WHERE num NOT IN
        (SELECT Lesser.num 
            FROM T_Number AS Lesser, T_Number AS Greater
            WHERE Lesser.num < Greater.num);
    
    最后就得到了我们想要的结果:
  • 相关阅读:
    13 110内容回、111内容回顾、redis操作
    11 git第二部分(未完成)
    10 内容回顾和补充、分页加密
    09 深科技相关表结构 (未完成)、git
    $ python manage.py makemigrations You are trying to add a non-nullable field 'name' to course without a default; we can't do that (the database needs something to populate existing rows). Please selec
    6、DockerFile解析:三步走、保留字指令
    Linux 中各个文件夹的作用
    H.264 Profile-level-id
    H.264编码profile & level控制
    H.264分层结构与码流结构
  • 原文地址:https://www.cnblogs.com/wxxweb/p/2094098.html
Copyright © 2020-2023  润新知