连续几年出现的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求解:查询连续七天以上都有打卡的员工记录

如何将前几年的数据添加到这个 SQL 查询中(也可以让它变得更简单)?

2022-11-25:连续出现的数字。编写一个 SQL 查询,查找所有至少连续出现三次的数字。 答案是输出1,原因是1是唯一连续出现三次的数字。 DROP TABLE IF EXISTS logs;

sql 180. 连续出现的数字

180. 连续出现的数字

SQL查找连续出现的数字