[英]Sql getting MAX and MIN values based on two columns for the ids from two others
我在查明查詢時遇到困難,有人可以協助我嗎? 問題:4列代表2個單獨測試的結果。 其中一個攝於英國,另一個攝於美國。 兩者都是相同的考試,我需要找到在這兩個國家進行的考試的最高和最低分數。 我還需要避免使用子查詢和臨時表。 將了解該問題的理論思想和實際解決方案。
該表如下所示:
ResultID Test_UK Test_US Test_UK_Score Test_US_Score
1 1 2 48 11
2 4 1 21 24
3 3 1 55 71
4 5 6 18 78
5 7 4 19 49
6 1 3 23 69
7 5 2 98 35
8 6 7 41 47
我正在尋找所需的結果:
TestID HighestScore LowestScore
1 71 23
2 35 11
3 69 55
4 49 21
5 98 18
6 78 41
7 47 19
我嘗試實現一個比較的案例,但是我仍然以子查詢結束以得出最終結果。 也嘗試了合並,但最終再次出現在子查詢中。 據我認為,當進行查詢時應該是一種情況,但實際上並不能提出邏輯,因為它需要匹配測試的ID。 謝謝! 我嘗試過並獲得最佳結果的方法(仍然錯誤)
select v.TestID,
max(case when Test_US_Score > Test_UK_Score then Test_UK_Score else null end) MaxS,
min(case when Test_UK_Score > Test_US_Score then Test_US_Score else null end) MinS
FROM ResultsDB rDB CROSS APPLY
(VALUES (Test_UK, 1), (Test_US, 0)
) V(testID, amount)
GROUP BY v.TestID
額外
M. Kanarkowski提供的答案是一個完美的解決方案。 我不是CTE專家,而且有點困惑,如何修改此查詢以返回找到min和max的行的結果ID。
像這樣的東西:
TestID Result_ID_Max Result_ID_Min
1 3 6
2 7 1
3 6 3
額外2
查詢的期望結果將是這樣的。 最后兩列表示原始表中找到最大值和最小值的行的ID。
TestID HighestScore LowestScore Result_ID_Of_Max Result_ID_Of_Min
1 71 23 3 6
2 35 11 7 1
3 69 55 6 3
例如,您可以使用union
匯總兩個國家/地區的結果,然后僅選擇數據的最大值和最小值。
with cte as (
select Test_UK as TestID, Test_UK_Score as score from yourTable
union all
select Test_US as TestID, Test_US_Score as score from yourTable
)
select
TestID
,max(score) as HighestScore
,min(score) as LowestScore
from cte
group by TestID
order by TestID
額外:我假設您想在前面的結果中添加額外的列。 如果不是只取上面的選擇和更換Test_UK_Score
和Test_US_Score
與ResultID
。
with cte as (
select Test_UK as TestID, Test_UK_Score as score, ResultID from yourTable
union all
select Test_US as TestID, Test_US_Score as score, ResultID from yourTable
)
select
TestID
,max(score) as HighestScore
,min(score) as LowestScore
,max(ResultID) as Result_ID_Max
,min(ResultID) as Result_ID_Min
from cte
group by TestID
order by TestID
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.