Получите минимальную ценность на пользователя

У меня есть этот код SQL, я хочу рассчитать последний баланс платы за каждого студента для каждого внесенного депозита. До сих пор мне удавалось достичь этого, но теперь вопрос в том, как мне выбрать только последний баланс, игнорируя другие предыдущие записи / Балансы

(select

     f.Totals -SUM(Total) OVER(ORDER BY pay_Id ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as Balance,
     p.Total as 'TotalPaid',
c.class_id as 'ClassID',
p.std_ID as 'STDID',
c.class_name as 'Class',
a.ad_stdname as 'Name',
t.term_id as 'TermID',
t.term_name as 'Term',
p.Date as 'Date',
case when (st.str_id = null) then '-' else st.str_id end as 'StrID',
case when (p.Tution_fee = null) then '0' else p.Tution_fee end as 'Tution',
case when (p.adm_fee = null) then '0' else p.adm_fee end as 'Admission',
case when (p.Activity_fee = null) then '0' else p.Activity_fee end as 'Activity',
case when (p.Textbk_Statio = null) then '0' else p.Textbk_Statio end as 'Texbooks',
case when (p.Transport_fee = null) then '0' else p.Transport_fee end as 'Transport'
from Payments p
 inner join Admissions a 
 on a.ad_id = p.std_ID
 inner join classes c 
 on c.class_id =p.class_id
   inner join fees f on f.fee_classID = p.class_id and f.Term_id = p.Term_id
 left join streams st
 on st.str_id = p.str_id
 inner join terms t 
 on p.Term_id = t.term_id
 where a.ad_id = 29
 )
 order by  p.std_name,Balance,p.Date  desc

Это мой текущий результат

1 ответ

Я выбрал минимальное значение для каждого пользователя в примере ниже:

значение даты пользователя

Сону 1/2/2010 1,5
Пн 03.01.2010 2,5
Арун 04.08.2009 3,5
Сону 02.02.2010 1,0
Пн 02.12.2009 0,5

select t.username, t.date, t.value
from MyTable t
inner join (
    select username, min(value) as value
    from MyTable
    group by username
) tm on t.username = tm.username and t.value = tm.value

Демо sql Fiddle

Используйте приведенную выше логику для реализации в своем коде

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

with MyTable as (select   
f.Totals -SUM(Total) OVER(ORDER BY pay_Id ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as Balance,
p.Total as 'TotalPaid',
c.class_id as 'ClassID',
p.std_ID as 'STDID',
c.class_name as 'Class',
a.ad_stdname as 'Name',
t.term_id as 'TermID',
t.term_name as 'Term',
p.Date as 'Date',
case when (st.str_id = null) then '-' else st.str_id end as 'StrID',
case when (p.Tution_fee = null) then '0' else p.Tution_fee end as 'Tution',
case when (p.adm_fee = null) then '0' else p.adm_fee end as 'Admission',
case when (p.Activity_fee = null) then '0' else p.Activity_fee end as 'Activity',
case when (p.Textbk_Statio = null) then '0' else p.Textbk_Statio end as 'Texbooks',
case when (p.Transport_fee = null) then '0' else p.Transport_fee end as 'Transport'
from Payments p
 inner join Admissions a 
 on a.ad_id = p.std_ID
 inner join classes c 
 on c.class_id =p.class_id
 inner join fees f on f.fee_classID = p.class_id and f.Term_id = p.Term_id
 left join streams st
 on st.str_id = p.str_id
 inner join terms t 
 on p.Term_id = t.term_id
 where a.ad_id = 29
 order by  p.std_name,Balance,p.Date  desc) select * from MyTable 
 inner join
 (
    select STDID, min(Balance) as value
    from MyTable
    group by STDID
) tm on t.STDID = tm.STDID and t.Balance = tm.Balance
Другие вопросы по тегам