我確定這是一個常見的要求,但我不知道如何正式要求。找到每個家長的最高價值
我很久以前在軍隊時遇到過這個問題。一名士兵有多次體能測試,但最近的主要測試是計數。這名士兵也擁有多種槍法資格,但只有最近分配的武器才具有重要意義。
你如何創建一個視圖,項目的父母最重要的孩子?
我確定這是一個常見的要求,但我不知道如何正式要求。找到每個家長的最高價值
我很久以前在軍隊時遇到過這個問題。一名士兵有多次體能測試,但最近的主要測試是計數。這名士兵也擁有多種槍法資格,但只有最近分配的武器才具有重要意義。
你如何創建一個視圖,項目的父母最重要的孩子?
用途:
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
雖然我不太清楚你是通過 「逐項」 意味着什麼,你可以做一些事情,像這樣:
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測試。
從前面的兩個答案,但也許更詳細一點沒有顯著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
您可以發佈「逐項說明」前後數據的例子嗎? – Oded 2010-08-16 17:18:40
對於哪個數據庫--SQL Server或Sybase?版本也會有幫助。 – 2010-08-16 17:27:07