选择除特定列中具有maxvalue的行以外的所有内容

时间:2018-06-06 13:07:09

标签: sql firebird firebird2.5

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

Original Stack: 1->2->3->4->5->7->NULL
Auxiliary Stack: NULL

我想要的只是选择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             
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               

我试过了:

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             

消除了最大值,但结果却一无所获。当我使用<而不是=在MAXVALUE(c2.GRUPA)之前我得到:

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))
显然,因为我正在消除低于最大值的所有值(据我所知)。

我也尝试了一些更简单的方法:

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             

但在结果窗口中我什么都没得到。如果我将“MAXVALUE(GRUPA)”更改为“3”,我会得到预期的结果,但同样,我无法指定最大值。

我做错了什么?

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

据我所知,你想要:

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不等于GRUPA的最大值的所有行(对于ID_RODZICA)。

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

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

您尝试的第二个查询不起作用,因为MAXVALUE没有按照您的想法执行操作。它不是聚合函数,而是从作为参数传递的值列表中返回最高值。给定传递单个值,它将返回该值。这导致GRUPA < MAXVALUE(GRUPA)等同于GRUPA < GRUPA,这永远不会成立,所以它再也不会产生任何行。