Sql 如何根据另一个值停止连续相同的时间获取日期范围?
以下是我的数据示例:Sql 如何根据另一个值停止连续相同的时间获取日期范围?,sql,tsql,Sql,Tsql,以下是我的数据示例: VendingID Date SnackType User TotalBought 9 2014-11-30 chocolate ben 10 9 2015-11-30 chocolate frank 12 9 2016-11-30 chocolate ben 9 9 2014-11-30 crisps ben
VendingID Date SnackType User TotalBought
9 2014-11-30 chocolate ben 10
9 2015-11-30 chocolate frank 12
9 2016-11-30 chocolate ben 9
9 2014-11-30 crisps ben 10
9 2015-11-30 crisps frank 12
9 2016-11-30 crisps ben 9
10 2014-11-30 chocolate ben 10
10 2015-11-30 chocolate frank 12
10 2016-11-30 chocolate ben 9
10 2017-11-30 chocolate frank 7
10 2018-11-30 chocolate frank 7
10 2019-11-30 chocolate frank 6
10 2014-11-30 crisps frank 9
10 2015-11-30 crisps frank 7
10 2016-11-30 crisps ben 9
10 2017-11-30 crisps frank 7
10 2018-11-30 crisps ben 3
10 2019-11-30 crisps ben 2
是否可以将给定VendingID的用户(即最近日期的用户)按类型购买的零食总数相加,直到用户发生变化为止,这只能追溯到连续几年
因此,VendingID 10的预期结果将是:对于巧克力,用户将是“frank”,这将是2019年、2018年和2017年的总和,只有当用户发生变化时,才会返回6+7+7=20的值。在同一个查询中,我还想返回相同的薯片,因此用户将仅对2019年和2018年求和,即2+3=5。因此,返回的结果将是:
小吃式苏打水
巧克力20
薯片5
因此,我认为我可以通过VendingID获取当前最新日期的SnackType和USer,但不知道如何获取与连续年份相关的范围,这样我就可以计算购买的总数:
SELECT SnackType, User
FROM vendingOptions vo
JOIN (SELECT MAX(Date) as maxDate
FROM vendingOptions vo2
WHERE VendingID = '10') as md
ON md.maxDate = vo.Date
WHERE VendingID = '10'
嗯。我不确定连续几年是否真的很重要,或者仅仅是对同一个用户的最终运行。让我假设是后者:
select vendingid, snacktype, sum(totalbought)
from (select vo.*,
max(case when user <> last_user then date end) over (partition by vendingid) as last_nonuserdate
from (select vo.*,
first_value(vo.user) over (partition by vendingid order by date desc) as last_user
from vendingoptions vo
) vo
) vo
where date > last_nonuserdate or last_nonuserdate is null
group by vendingid, snacktype
order by vendingid, snacktype;
最里面的子查询查找每个供应商的最后一个用户。中间的子查询然后查找其他用户的最新日期。外部查询过滤和聚合。这将如何工作格式有点混乱,但首先我认为last_nonuserdate在同一选择级别上使用last_nonuserdate别名。它似乎不喜欢WHERE子句中的“last_nonuserdate”。它表示无效的列名。用实际max代码替换别名会出现错误“窗口函数只能出现在SELECT或ORDER BY子句”@sr28。正如我在逻辑中解释的,过滤应该在最外层的查询中。我修正了这个查询,以遵循这个解释。谢谢你的更新和你投入的时间。然而,我现在得到了一个错误,范围窗口框架不能包含LOB类型的表达式。据我所知,这意味着我的一个对象被认为是一个大对象,所以只需要弄清楚,出于某种原因,snackType被设置为varcharmax,这很可能是问题所在。让我来修理一下,看看这是否有效。