Sql получает значения MAX и MIN на основе двух столбцов для идентификаторов из двух других - PullRequest
0 голосов
/ 07 июня 2019

У меня возникают трудности с выяснением запроса, сможет ли кто-нибудь помочь мне с этим? Проблема: 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

Я пытался реализовать случай сравнения, но у меня все еще был подзапрос, чтобы получить окончательные результаты. Также попытался объединение, но он снова оказывается в подзапросе. Насколько я могу подумать, это будет случай, когда запрос, но не может придумать логику для этого, так как это требует совпадения идентификаторов тестов. Спасибо! То, что я пробовал и получил лучшие результаты (все еще неправильно)

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

Extra

Ответ предоставлен M. Канарковский является идеальным решением. Я не эксперт по CTE, и немного смущен, как можно адаптировать этот запрос, чтобы он возвращал идентификатор результата строки, в которой были найдены min и max.

как то так:

TestID Result_ID_Max Result_ID_Min
  1          3              6
  2          7              1 
  3          6              3 

Дополнительно 2

Желаемые результаты запроса приведут меня к следующему. Два последних столбца представляют идентификаторы строк из исходной таблицы, в которых были найдены значения max и min.

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 

1 Ответ

1 голос
/ 07 июня 2019

Например, вы можете использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...