2013-03-18 4 views
0

Мне нужна помощь в создании команды SQL для запроса к базе данных. База данных состоит из 5 столбцов:Выбор конкретных данных на основе нескольких условий

Date(string) 
Name(string) 
number(int) 

Для каждой даты, имени и номера может быть несколько записей.

Я хочу выбрать только одну строку для каждой комбинации даты и имени. Проблема в том, что есть несколько примеров из них. Для каждой комбинации даты и имени я хочу выбрать номер с наибольшим номером. Я бы хотел, чтобы он был заказан по дате. Например:

date | name | number 
1/1/1  henry  500 
1/1/1  henry  2000 
1/1/1  jacob  5 
1/1/1  jacob  8 
1/2/1  henry  6 

Команда вернется:

1/1/1  henry  2000 
1/1/1  jacob  8 
1/2/1  henry  6 

Я возиться с некоторыми командами, но я довольно потерял. Возможно ли это?

+0

Что SQL вкус (MySql, SQL Server, Oracle и т.д.) вы используете? Что вы уже пробовали? Вы знаете, как использовать предложение GROUP BY? –

+0

SQL Server 2012. Да, да. Думаю, я вижу, с чем ты собираешься. Я сделаю это. – 40Alpha

+1

Я разместил то, что имел в виду. Если бы у вас были другие столбцы, которые вам нужно было видеть, то решение было бы не таким простым, как мое. –

ответ

2

Вы можете использовать ROW_NUMBER:

WITH cte 
    AS (SELECT date, 
       name, 
       number, 
       rn = Row_number() 
         OVER( 
         partition BY date, name 
         ORDER BY number DESC) 
     FROM dbo.tablename) 
SELECT date, 
     name, 
     number 
FROM CTE 
WHERE rn = 1 
ORDER BY date ASC 

DEMO

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

+0

Спасибо. Тем не менее я не уверен, что я понимаю WITH cte ... может ли это быть использовано в SQL Server? – 40Alpha

+0

@ 40Alpha: Да, это TSQL, который работает в MS SQL-Server. Он использует ['Common Table Expression'] (http://msdn.microsoft.com/en-us/library/ms175972.aspx) + [' ROW_NUMBER'] (http://msdn.microsoft.com/en- us/library/ms186734.aspx) (который также существует в других rdbms, таких как Oracle). Я использовал CTE для упрощения, так как они повышают читаемость. –

+0

Имеет смысл теперь ха-ха! Спасибо. Я дам вам знать, если это сработает. – 40Alpha

0

Попробуйте сгруппировать по дате и названию, а затем выберите максимальное число. Как так (точный синтаксис может изменяться в зависимости от версии SQL):

select 
    date, 
    name, 
    max(number) 
from 
    yourtable 
group by 
    date, 
    name 
order by 
    date asc 
0
SELECT date, name, MAX(number) 
FROM Table1 
GROUP BY date, name 
ORDER date, name 
Смежные вопросы