【问题标题】:Get minimum value per user获得每个用户的最低价值
【发布时间】:2020-06-20 12:22:15
【问题描述】:

我这里有这个 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

这是我当前的输出

【问题讨论】:

  • 您如何确定哪一行是最新行?..datetime 明智..?将问题深入到小例子..
  • @Always_a_learner 我试过使用 max(date) 但它返回错误
  • 你能把你的问题合并到小桌子上吗?我可以看到所有日期都相同,所以哪一行是最新的?
  • @Always_a_learner 我可能问错了问题;我需要的是仅从余额列中获得最小/最小余额
  • 我已经更新了我的答案。见下文

标签: sql running-balance


【解决方案1】:

我在下面的例子中为每个用户选择了最小值:

用户日期值

Sonu 2010 年 1 月 2 日 1.5
莫努 2010 年 1 月 3 日 2.5
阿伦 2009 年 8 月 4 日 3.5
索努 2/2/2010 1.0
莫努 2009 年 12 月 2 日 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

Demo 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

【讨论】:

  • 你好,这不起作用。我没有余额栏。它是从运行总数中计算出来的
  • 将上述查询存储在嵌套查询中,并赋予别名 Mytable..您的查询结果将被视为该查询的表
  • 我试图让您的最终查询运行并让我知道它是否有效
  • 复制你在 sqlfiddler 中的问题并分享我会研究它
猜你喜欢
  • 1970-01-01
  • 2023-03-28
  • 2022-10-16
  • 2014-05-09
  • 2021-01-07
  • 2022-11-18
  • 1970-01-01
  • 2019-01-16
  • 2015-09-16
相关资源
最近更新 更多