2010-08-16 55 views
1

我確定這是一個常見的要求,但我不知道如何正式要求。找到每個家長的最高價值

我很久以前在軍隊時遇到過這個問題。一名士兵有多次體能測試,但最近的主要測試是計數。這名士兵也擁有多種槍法資格,但只有最近分配的武器才具有重要意義。

你如何創建一個視圖,項目的父母最重要的孩子?

+0

您可以發佈「逐項說明」前後數據的例子嗎? – Oded 2010-08-16 17:18:40

+0

對於哪個數據庫--SQL Server或Sybase?版本也會有幫助。 – 2010-08-16 17:27:07

回答

1

用途:

SELECT p.*, x.* 
    FROM PARENT p 
    JOIN CHILD x ON x.parent_id = p.id 
    JOIN (SELECT c.id, 
       c.parent_id, 
       MAX(c.date_column) AS max_date 
      FROM CHILD c 
     GROUP BY c.id, c.parent_id) y ON y.id = x.id 
            AND y.parent_id = x.parent_id 
            AND y.max_date = x.date 

假設的SQL Server 2005+:

WITH summary AS (
    SELECT p.*, 
      c.*, 
      ROW_NUMBER() OVER (PARTITION BY p.id 
            ORDER BY c.date DESC) AS rank 
     FROM PARENT p 
     JOIN CHILD c ON c.parent_id = p.id) 
SELECT s.* 
    FROM summary s 
WHERE s.rank = 1 
1

雖然我不太清楚你是通過 「逐項」 意味着什麼,你可以做一些事情,像這樣:

Select .. 
From Soldier 
    Left Join FitnessTest 
     On FitnessTest.SoldierId = Soldier.Id 
      And FitnessTest.TestDate = (
             Select Max(FT1.TestDate) 
             From FitnessTest As FT1 
             Where FT1.SoldierId = FitnessTest.SoldierId 
             ) 
    Left Join MarksmanshipTest 
     On MarksmanshipTest.SoldierId = Soldier.Id 
      And MarksmanshipTest.TestDate = (
              Select Max(MT1.TestDate) 
              From MarksmanshipTest As MT1 
              Where MT1.SoldierId = MarksmanshipTest.SoldierId 
              ) 

這假設一個士兵不能有兩個測試日期時間值的健身測試或markmansh ip測試。

0

從前面的兩個答案,但也許更詳細一點沒有顯著differnce:

create table soldier (soldierId int primary key, 
    name varchar(100)) 
create table fitnessTest (soldierId int foreign key references soldier, 
    occurred datetime, result int) 
create table marksmanshipTest (soldierId int foreign key references soldier, 
    occurred datetime, result int) 

;with 
mostRecentFitnessTest as 
(
    select 
     fitnessTest.soldierId, 
     fitnessTest.result, 
     row_number() over (order by occurred desc) as row 
    from fitnessTest 
), 
mostRecentMarksmanshipTest as 
(
    select 
     marksmanshipTest.soldierId, 
     marksmanshipTest.result, 
     row_number() over (order by occurred desc) as row 
    from marksmanshipTest 
) 
select 
    soldier.soldierId, 
    soldier.name, 
    mostRecentFitnessTest.result, 
    mostRecentMarksmanshipTest.result 
from soldier 
    left outer join mostRecentFitnessTest on 
     mostRecentFitnessTest.soldierId = soldier.soldierId 
     and mostRecentFitnessTest.row = 1 
    left outer join mostRecentMarksmanshipTest on 
     mostRecentMarksmanshipTest.soldierId = soldier.soldierId 
     and mostRecentMarksmanshipTest.row = 1