Запрос SQL Server для выбора локальных максимумов - PullRequest
0 голосов
/ 01 февраля 2010

У меня есть эти данные.Мне нужно получить наименьшее количество $ полных строк для каждого человека.

Amount Date    Name
$123   Jun 1   Peter
$120   Jun 5   Peter
$123   Jun 5   Paul
$100   Jun 1   Paul
$220   Jun 3   Paul

Результат запроса SQl Server должен быть:

$120   Jun 5   Peter
$100   Jun 1   Paul

Ответы [ 5 ]

3 голосов
/ 01 февраля 2010

SQL Server 2005+ Версия

;WITH CTE AS
(
    SELECT
        Amount, [Date], Name,
        ROW_NUMBER() OVER (PARTITION BY Name ORDER BY [Amount]) AS RowNum
    FROM Table
)
SELECT *
FROM CTE
WHERE RowNum = 1

Альтернативная версия

SELECT t.Amount, t.[Date], t.Name
FROM
(
    SELECT Name, MIN(Amount) AS MinAmount
    FROM Table
    GROUP BY Name
) m
INNER JOIN Table t
    ON t.Name = m.Name
    AND t.Amount = m.Amount
2 голосов
/ 01 февраля 2010

Один способ, который работает на SQL Server 7 и выше

select t1.* 
from(select min(amount) Minamount,name
from Yourtable
group by name) t2 
join Yourtable t1 on t1.name = t2.name
and t1.amount = t2.Minamount

Существует несколько способов решения этой проблемы, см. Здесь: Включая связанные значения агрегированного столбца

1 голос
/ 01 февраля 2010

Не совсем самый эффективный из возможных, но проще для чтения:

SELECT DISTINCT [Name], [Date], MIN([Amount]) OVER(PARTITION BY [Name])
FROM #Table
1 голос
/ 01 февраля 2010

Группа на человека, чтобы получить наименьшую сумму для каждого человека, а затем присоединиться к таблице, чтобы получить дату для каждой строки:

select y.Amount, y.Date, y.Name
from (
  select min(Amount), Name
  from TheTable
  group by Name
) x
inner join TheTable y on x.Name = y.Name and x.Amount = y.Amount

Если сумма может существовать более чем на одну дату для человека, выберите одну из дат, например первую:

select y.Amount, min(y.Date), y.Name
from (
  select min(Amount), Name
  from TheTable
  group by Name
) x
inner join TheTable y on x.Name = y.Name and x.Amount = y.Amount
group by y.Amount, y.Name
1 голос
/ 01 февраля 2010
SELECT * FROM TableName T1 WHERE NOT EXISTS 
    (SELECT * FROM TableName T2 
    WHERE T2.Name = T1.Name AND T2.Amount < T1.Amount)

В случае связей в этом сценарии будут показаны обе строки.

...