连续几年出现的SQL查询数据
Posted
技术标签:
【中文标题】连续几年出现的SQL查询数据【英文标题】:SQL query data that appears for consecutive years 【发布时间】:2020-06-02 21:20:02 【问题描述】:我已经尝试了几次来解决这个问题,但没有运气。
我有一个要查询的表。
InvNo(主键), 客户 ID, 增值税, 日期PD
我想提取连续 3 个会计年度至少支付过一张发票的所有客户。此示例的会计年度为下一年的 8 月 1 日至 7 月 31 日。 Thie InvNo 是唯一的,但 custID 可能会出现多次,具体取决于他们支付了多少发票。谁能帮我解决这个问题?
对于输出,我需要每个 custID 一条记录,以及该 CustID 已支付发票的连续年数。
CustID 333 连续 7 年
【问题讨论】:
请提供样本数据和期望的结果。 “我试过好几次”在哪里???我没有看到一个查询。 CustID 连续年份 CustID 连续年份 1 4 2 3 3 7 6 1 11 2 12 21 【参考方案1】:您可以通过减去 8 个月或加上 4 个月并提取年份来获得年份。那么lag()
就可以解决问题了:
select distinct custid
from (select t.*, lag(yyyy, 2) over (partition by custid order by yyyy) as prev_yyyy_2
from (select distinct custid, year(dateadd(month, -8, datepd)) as yyyy
from t
) t
) t
where prev_yyyy_2 = yyyy - 2;
最里面的子查询只得到一对客户和年份。 lag()
看起来落后两排。如果“落后 2 行”正好是 2 年前,则存在 3 年。
【讨论】:
是的,我已经朝着这个方向发展,问题是一个客户可以在一年内支付数百张发票。我只关心客户连续年支付了至少一张发票。 @BillDickson 。 . .这就是这个查询的作用。这就是为什么在最里面的子查询中有一个select distinct
。
我现在明白了。您能向我解释一下 (dateadd(month, -8, datepd) 如何确定年份吗?谢谢。
@BillDickson 。 . .好吧,事实并非如此。减去 8 个月。 year()
提取年份。减法是为了使年份与您对财政年度的定义保持一致。以上是关于连续几年出现的SQL查询数据的主要内容,如果未能解决你的问题,请参考以下文章
如何将前几年的数据添加到这个 SQL 查询中(也可以让它变得更简单)?
2022-11-25:连续出现的数字。编写一个 SQL 查询,查找所有至少连续出现三次的数字。 答案是输出1,原因是1是唯一连续出现三次的数字。 DROP TABLE IF EXISTS logs;