Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何根据另一个值停止连续相同的时间获取日期范围?_Sql_Tsql - Fatal编程技术网

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,这很可能是问题所在。让我来修理一下,看看这是否有效。