簡體   English   中英

SQL從兩列中獲取基於兩個列的ID的MAX和MIN值

[英]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_ScoreTest_US_ScoreResultID

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.

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