代码之家  ›  专栏  ›  技术社区  ›  Maciej Czapiewski

选择除某列中最大值为的行以外的所有内容

  •  1
  • Maciej Czapiewski  · 技术社区  · 6 年前

    我有一个包含数据的表,我正在尝试选择一些值小于最大值的值。我使用的是ibexpert,我需要在sql中完成这项工作,因为我正在处理firebird数据库。我的桌子是这样的:

    UID      TYP  ID_RODZICA  ID_DZIALKI  PRZED_PO  GRUPA  DTW               OSOW  DTU  OSOU
     17 170  K         5 765       3 551  0             1                                     
    163 759  N         5 765      53 084  0             1  29.03.2018 11:45    21             
    163 760  N         5 765      49 796  1             1  29.03.2018 11:45    21             
    163 761  N         5 765      49 426  1             1  29.03.2018 11:45    21             
    163 762  N         5 765      53 085  1             1  29.03.2018 11:45    21             
    163 763  N         5 765      53 086  1             1  29.03.2018 11:45    21             
    163 764  N         5 765      53 087  0             2  29.03.2018 11:45    21             
    163 765  N         5 765      53 088  0             2  29.03.2018 11:45    21             
    163 766  N         5 765       8 940  0             2  29.03.2018 11:45    21             
    163 767  N         5 765      41 931  0             2  29.03.2018 11:45    21             
    253 171  N         5 765      41 931  0             3  29.03.2018 21:14    21             
    253 172  N         5 765      53 088  0             3  29.03.2018 21:14    21             
    253 173  N         5 765       8 940  0             3  29.03.2018 21:14    21             
    253 174  N         5 765      49 796  0             3  29.03.2018 21:14    21             
    253 175  N         5 765      49 426  0             3  29.03.2018 21:14    21             
    253 176  N         5 765      53 085  0             3  29.03.2018 21:14    21             
    253 177  N         5 765      53 086  0             3  29.03.2018 21:14    21             
    253 178  N         5 765      67 386  0             3  29.03.2018 21:14    21             
    253 179  N         5 765      67 387  0             3  29.03.2018 21:14    21             
    253 180  N         5 765      67 388  0             3  29.03.2018 21:14    21               
    

    我只想选择GRUPA值低于最大值的行,这里的最大值是3,但有时可能是5、7、11或其他值,所以无法指定值。

    应该是这样的:

    UID      TYP  ID_RODZICA  ID_DZIALKI  PRZED_PO  GRUPA  DTW               OSOW  DTU  OSOU
     17 170  K         5 765       3 551  0             1                                     
    163 759  N         5 765      53 084  0             1  29.03.2018 11:45    21             
    163 760  N         5 765      49 796  1             1  29.03.2018 11:45    21             
    163 761  N         5 765      49 426  1             1  29.03.2018 11:45    21             
    163 762  N         5 765      53 085  1             1  29.03.2018 11:45    21             
    163 763  N         5 765      53 086  1             1  29.03.2018 11:45    21             
    163 764  N         5 765      53 087  0             2  29.03.2018 11:45    21             
    163 765  N         5 765      53 088  0             2  29.03.2018 11:45    21             
    163 766  N         5 765       8 940  0             2  29.03.2018 11:45    21             
    163 767  N         5 765      41 931  0             2  29.03.2018 11:45    21             
    

    我试过:

    SELECT c1.*
    FROM (select * FROM obdg where ID_RODZICA = '5765') c1
    WHERE NOT EXISTS
        (SELECT c2.*
        FROM (select * from obdg WHERE ID_RODZICA = '5765') c2
    WHERE c1.GRUPA = MAXVALUE(c2.GRUPA))
    

    去掉最大值,但结果就是什么都没有。当我在maxvalue(c2.grupa)之前使用<而不是=时,我得到:

    UID      TYP  ID_RODZICA  ID_DZIALKI  PRZED_PO  GRUPA  DTW               OSOW  DTU  OSOU
    253 171  N         5 765      41 931  0             3  29.03.2018 21:14    21             
    253 172  N         5 765      53 088  0             3  29.03.2018 21:14    21             
    253 173  N         5 765       8 940  0             3  29.03.2018 21:14    21             
    253 174  N         5 765      49 796  0             3  29.03.2018 21:14    21             
    253 175  N         5 765      49 426  0             3  29.03.2018 21:14    21             
    253 176  N         5 765      53 085  0             3  29.03.2018 21:14    21             
    253 177  N         5 765      53 086  0             3  29.03.2018 21:14    21             
    253 178  N         5 765      67 386  0             3  29.03.2018 21:14    21             
    253 179  N         5 765      67 387  0             3  29.03.2018 21:14    21             
    253 180  N         5 765      67 388  0             3  29.03.2018 21:14    21             
    

    显然,因为我正在消除所有低于max的值(据我所知)。

    我还尝试了更简单的方法:

    SELECT * FROM OBDG
    WHERE ID_RODZICA = '5765' AND GRUPA < MAXVALUE(GRUPA)
    

    但我在结果窗口里什么也没得到。如果我将“max value(grupa)”更改为“3”,我将得到预期的结果,但同样,我无法指定最大值。

    我做错什么了?

    2 回复  |  直到 6 年前
        1
  •  0
  •   Mark Rotteveel    6 年前

    从你的问题中我可以看出,你想要:

    select a.* 
    from OBDG a 
    where a.ID_RODZICA = '5765' 
    and a.GRUPA <> (select max(GRUPA) 
                    from OBDG b 
                    where b.ID_RODZICA = a.ID_RODZICA)
    

    即:选择所有行 GRUPA 不等于的最大值 格鲁帕 (为此 ID_RODZICA )

    至于为什么查询不起作用:

    在第一个查询中, NOT EXISTS 将始终生成给定示例数据的行,并且在 不存在 这意味着结果总是错误的,因此整个查询不产生任何行。

    您尝试的第二个查询不起作用,因为 MAXVALUE 不做你想做的事。它不是聚合函数,而是从作为参数传递的值列表中返回最高值。如果传递一个值,它将返回该值。结果是 GRUPA < MAXVALUE(GRUPA) 相当于 GRUPA < GRUPA 这从来不是真的,所以它也不会产生行。

        2
  •  0
  •   Gordon Linoff    6 年前

    “低于”最大值意味着不存在更高的值。所以。…

    SELECT o.*
    FROM obdg o
    WHERE ID_RODZICA = 5765 AND - I'm guessing it is a number so the single quotes are not necessary
          NOT EXISTS (SELECT 1
                      FROM obdg o2
                      WHERE ID_RODZICA = 5765 AND o2.GRUPA > o.GRUPA
                      );
    

    肯定还有其他方式来表达这个查询。这似乎与你所尝试的最接近。

    注意我去掉了 5765 . 身份证通常是数字。如果你的是一个字符串,那么就用单引号。