Heim  >  Fragen und Antworten  >  Hauptteil

Suchen Sie den Maximalwert in der Tabelle und zeigen Sie dann die SQL-Gruppen separat sowie die Anzahl der Maximalwerte in jeder SQL-Gruppe an

ID  POSITION    EXPERIENCE  SALARY
1   top               90    1500
2   bottom           100    1500
3   top               90    750
4   left              90    1000
5   right            100    1300
6   top               90    1500
7   left              80    2000
8   top               80    1000
9   bottom           100    2000
10  left             100    2000

Das ist also mein TischSERVICE, bei dem (wie wir sehen können) die maximale Erfahrung 100 beträgt. Ich muss eine Abfrage schreiben, um die Anzahl der Vorkommen von 100 in der Erfahrung für jede nach Position gebildete Gruppe (links, rechts, oben, unten) zu ermitteln.

Also schrieb ich:-

select position,count(*)
from service
group by position
having experience=(select max(experience) from service);

Erwartete Ausgabe:-

POSITION  COUNT(*)
bottom         2 
left           1
right          1
top            0

Aber, Es gab mir eine Fehlermeldung: - „Kein GROUP BY-Ausdruck“

Meine Logik besteht darin, dass ich es zuerst in Gruppen aufteile und dann die Haveing-Klausel verwende, um die Tupel in jeder Gruppe zu zählen, deren Erfahrung dem Maximalwert entspricht. Erfahrung.

P粉451614834P粉451614834190 Tage vor377

Antworte allen(2)Ich werde antworten

  • P粉718730956

    P粉7187309562024-03-31 14:00:05

    一种方法是使用带有子查询的左连接,它仅返回最大值。需要使用 case 来返回具有任意最大值的组。

    SELECT s.position,
           sum(case when max_experience is null then 0 else 1 end ) as max_count
    FROM service s
    LEFT JOIN  ( select max(experience) as max_experience
                 from service 
                ) as s1 ON  s.experience = s1.max_experience
    group by s.position
    order by max_count desc ;

    https://dbfiddle.uk/-8pHZ8wm

    为了更容易理解,运行下面的查询,您将发现服务表中除值 100 之外的每一行中 max_experience 均为空。简单来说,您只需要计算组中值为 100 和 0 的行还没有达到最大经验值。

    SELECT s.*,s1.*
    FROM service s
    LEFT JOIN  (select max(experience) as max_experience
                 from service 
                ) as s1 ON  s.experience = s1.max_experience ;

    https://dbfiddle.uk/al8YYLk9

    编辑。答案在 Oracle 中也有效,但需要删除子查询后面的关键字 as

    SELECT s.position,
           sum(case when max_experience is null then 0 else 1 end ) as max_count
    FROM service s
    LEFT JOIN  ( select max(experience) as max_experience
                 from service 
                )  s1 ON  s.experience = s1.max_experience
    group by s.position
    order by max_count desc ;

    https://dbfiddle.uk/hhGB_xXx

    Antwort
    0
  • P粉936568533

    P粉9365685332024-03-31 09:12:10

    使用求和

    select position, sum(experience = 100) from tbl group by position

    参见小提琴

    Antwort
    0
  • StornierenAntwort