2010-12-30 4 views
1

Извините, если заголовок трудно понять - я не совсем уверен, как описать, что я хочу делать. Скажем, у меня есть эта таблица. test1 и test2 являются ИНТ колонны, в то время как test3 это строка/VARCHAR:Выберите верхнее поле на основе заказа другого поля

test1 | test2 | test3 
1  1  one 
1  2  two 
1  3  three 
1  4  four 
2  10  ten 
2  11  eleven 
2  12  twelve 
3  101  one hundred one 
3  104  one hundred four 
3  107  one hundred seven 

Я пытаюсь выяснить, выберите запрос, который будет возвращать верхний TEST3 для каждого test1, где заказ делается на основе стоимости в test2. Другими словами, я пытаюсь найти запрос, который будет возвращать это:

test1 | test3 
1  four 
2  twelve 
3  one hundred seven 

Было бы очень здорово, если решение может работать как на MS SQL Server (2005 и 2008) и MS Access (2007 и 2010).

+1

Я считаю, что вы хотели «1, четыре», а? – Quassnoi

+0

Спасибо, отредактирован для исправления. –

ответ

1

В SQL Server:

SELECT test1, test3 
FROM (
     SELECT test1, test3, ROW_NUMBER() OVER (PARTITION BY test1 ORDER BY test2 DESC) AS rn 
     FROM mytable 
     ) q 
WHERE rn = 1 

или

SELECT test1, test3 
FROM (
     SELECT DISTINCT test1 
     FROM mytable 
     ) md 
CROSS APPLY 
     (
     SELECT TOP 1 
       test3 
     FROM mytable mi 
     WHERE mi.test1 = md.test1 
     ORDER BY 
       mi.test2 DESC 
     ) mt 

Каждый из этих методов может быть более эффективным, чем другой, в зависимости от вашего распределения данных.

Эта статья может представлять интерес для Вас:

2

наименьший общий знаменатель ответ.

SELECT yourtable.test1, yourtable.test3 
FROM yourtable 
INNER JOIN 
(
SELECT test1, MAX(test2) AS test_2 
FROM yourtable 
GROUP BY test1 
) t 
ON t.test1 = yourtable.test1 AND t.test_2 = yourtable.test2 
Смежные вопросы