簡體   English   中英

從列中選擇MAX值,並從另一列中選擇相應的值

[英]Select MAX value from column and corresponding value from another

這可能是一個相對簡單的問題,但我正在努力解決。 我下面列出了三個表( owners, pets, petTypes ),並試圖在一個查詢中提取以下數據。 前兩個並不難,但是第三和第四是我努力的地方。

如果要復制表數據: https : //pastebin.com/veXHwcMc

問題:

  1. 擁有者編號

  2. 所有者名稱

  3. 主人最老的寵物年齡
  4. 主人最老的寵物類型名稱
  5. 其他寵物數

我嘗試過的

選擇年齡SELECT MAX(age) FROM pets

SELECT pets.ownerId, MAX(pets.age), petTypes.name FROM pets INNER JOIN petTypes ON pets.petTypeId = petTypes.id GROUP BY pets.ownerId;表以同時顯示SELECT pets.ownerId, MAX(pets.age), petTypes.name FROM pets INNER JOIN petTypes ON pets.petTypeId = petTypes.id GROUP BY pets.ownerId;

但這是錯誤的。 因為它們都在顯示貓的時候應該為最老的貓顯示正確的名稱。

我想到了這個問題: 如何在SQL中用另一列選擇MAX(列值),DISTINCT來選擇行?

所以我嘗試了: SELECT petTypes.id, petTypes.name FROM petTypes INNER JOIN (SELECT MAX(age) FROM pets GROUP BY ownerId) pets ON petTypes.id = pets.petTypeId;

但是引發的錯誤是ERROR 1054 (42S22): Unknown column 'petTypes.id' in 'on clause'

任何幫助請

表格+數據

工作演示:

SELECT O.ID, O.FirstName, O.LastName, P.Age, min(PT.Name) as TypeName, OPets.CntOfOtherPets
FROM Owners O
INNER JOIN (SELECT OwnerID, max(Age) MA, count(*)-1 as CntOfOtherPets 
            FROM Pets 
            GROUP BY OwnerID) OPets
 on  OPets.OwnerID = O.ID
INNER JOIN Pets P
 on P.Age = OPets.MA
and P.OwnerID = OPets.OwnerID
INNER JOIN PetTypes PT
 on P.PetTypeID = PT.ID
GROUP BY  O.ID, O.FirstName, O.LastName, P.Age, OPets.CntOfOtherPets ;

派生表OPets通過所有者減去1得到所有寵物的計數,因為我們知道這代表“其他寵物”計數。 寵物的最大年齡可通過匯總分組的所有者返回。 通過將此數據集重新加入寵物集,我們只能獲得擁有最大年齡的那個主人的寵物。 然后,我們加入petType以獲取該類型寵物的名稱(如果多個寵物共享相同的最大年齡,則為寵物)。

最后,對除PT.Name以外的所有字段進行分組,然后選擇min(PetType.Name)。 這樣,如果存在多個具有相同最老年齡的動物,我們將按字母順序從最早的名字中選擇具有TypeName的動物。 僅在返回數據的情況下,此方法才有效。 如果必須返回寵物名或寵物ID,則需要使用其他方法。 但這是迄今為止獲得所需結果(返回的列)的最簡單方法

count-1似乎有點駭人聽聞,因為count(*)返回所有寵物的數量-1只是減去了我們對#5要求擁有的寵物1: 其他寵物的數量。 即使在年齡關系上,這個#也是正確的。 由於count-1將永遠是“其他寵物”

這應該可以,不能測試,但是如果主人有兩個或更多相同年齡的寵物,它將顯示多個記錄。

   Select ow.Firstname, ow.lastname ,petinfo.Age, petinfo.Name, petcount.TotalPets
    from #owners ow
    join ( Select age, p.petTypeId, p.OwnerID, pt.name From 
               (select max(age) as age, petTypeId, OwnerID 
                from #pets p 
                Group by  OwnerID,petTypeId
                ) p
            Join #petTypes pt on pt.ID = p.petTypeId
           ) petinfo 
           on petinfo.OwnerID = ow.id
    Join (
          Select Count(*) TotalPets, ownerID 
          From #Pets 
          group by OwnerID
          ) petcount
         on petcount.ownerID = ow.ID

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM