2014-11-06 3 views
0

Я пытаюсь запросить таблицу ниже, которая является очень простым вариантом моей реальной таблицы,SQL агрегатной функция запрос выбор нескольких столбцов

ID SaleDate  Amount 
1 2014-09-01  50 
1 2014-10-01  20 
1 2014-11-01  10 
2 2013-11-01  10 
2 2013-12-01  20 
2 2014-01-01  25 

, чтобы получить выходной сигнал как

Выходного

ID MinDate  MaxDate StartAmount EndAmount 
1 2014-09-01 2014-11-01  50   10 
2 2013-11-01 2014-01-01  10   25 

Продавец SaleDate всегда растет. Но сумма может отличаться. Я взял минимальные и максимальные даты для каждого ID. Это легкая часть. Но я также хочу, чтобы сумма была на SaleDate.

Я попытался с помощью этого

Select x.ID,min(x.SaleDate) MinDate, x.Amount StartAmount, max(y.SaleDate) MaxDate,y.Amount EndAmount 
From Sales x Join Sales y 
On x.ID = y.ID 
Group By x.ID,y.ID,x.Amount,y.Amount 
Order By x.ID 

Но я уверен, что я не должен использовать поле Сумма в группе по функциям. Есть ли аналогичный вопрос в SO, который отвечает на этот тип ситуации? Или, если есть простое решение, просто укажите мне этот путь. Я не нуждаюсь в прямом ответе только для общего метода рассмотрения таких случаев.

+0

Что вы используете? –

+0

MS SQl Server 2012 – Xion

ответ

1

Большинство баз данных поддерживают стандартные окна и функции ранжирования ANSI. Вы можете сделать это с помощью row_number() и условной агрегации:

select s.id, min(saledate) as MinDate, max(saledate) as MaxDate, 
     max(case when seqnum = 1 then amount end) as StartAmount, 
     max(case when seqnum = cnt then amount end) as EndAmount 
from (select s.*, row_number() over (partition by s.id order by s.saledate) as seqnum, 
      count(*) over (partition by s.id) as cnt 
     from sales s 
    ) s 
group by s.id; 
+0

Так, как уже упоминалось, это всего лишь часть моей фактической таблицы. Похоже, если у меня есть другие столбцы в моей таблице, я хочу выбрать, скажем, другие столбцы записи MinDate, я бы не смог этого сделать из-за группы в конце. Есть ли для этого работа? – Xion

+1

@Xion. , , Вы можете выбрать дополнительные столбцы, используя ту же логику, что и для «StartAmount» и «EndAmount». –

1

вам нужно сделать это в два этапа. сначала, легкую часть, затем возьмите эти результаты и присоединитесь назад к исходной таблице, используя ваше значение min/max, чтобы посмотреть значение из соответствующего столбца.

select id, mindate, maxdate, 
      s_min.amount as startamount, s_max.amount as endamount 
    from (
    Select ID,min(SaleDate) MinDate, max(SaleDate) MaxDate 
    From Sales s 
    Group By ID 
    ) d inner join sales s_min on d.mindate = s.saledate and d.id = s.id 
    inner join sales s_max on d.maxdate = s.saledate and d.id = s.id 

Вы действительно присоединяетесь к одной и той же таблице дважды?

Смежные вопросы