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
这永远不会是真的,所以它再次不产生任何行。
我有一个 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
这永远不会是真的,所以它再次不产生任何行。