Select 除特定列中具有最大值的行之外的所有内容

Select everything except rows with maxvalue in certain column

我有一个 table 数据,我正在尝试 select 一些低于最大值的值。我正在使用 IBExpert,我需要在 SQL 中执行此操作,因为我正在使用 Firebird 数据库。我的 table 看起来像这样:

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               

我想要的是 select 只有 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             

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

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

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

但我还是没有得到任何结果 window。如果我将 "MAXVALUE(GRUPA)" 更改为“3”,我会得到预期的结果,但同样,我无法指定最大值。

我做错了什么?

"Lower" 比最大值意味着不存在更高的值。所以 。 . .

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 周围的单引号。 ID 通常是数字。如果你的确实是一个字符串,那么使用单引号。

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

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)

即:select GRUPA 不等于 GRUPA 最大值的所有行(对于 ID_RODZICA)。

关于为什么您的查询不起作用:

在您的第一个查询中,NOT EXISTS 中的子查询将始终生成给定示例数据的行,而在 NOT EXISTS 中,这意味着结果始终为 false,因此整个查询不产生任何行。

您尝试的第二个查询不起作用,因为 MAXVALUE 没有按照您的预期进行。它不是聚合函数,而是从作为参数传递的值列表中,它将 return 最高值。如果您传递一个值,它将 return 该值。这导致 GRUPA < MAXVALUE(GRUPA) 等同于 GRUPA < GRUPA 这永远不会是真的,所以它再次不产生任何行。