ZBLOG

peewee mysql 查询用户连续支付天数,支付记录中一天内会有多条支付订单。

如果支付记录中一天内会有多条支付订单,我们需要对每个用户的支付记录按照日期和订单号进行去重,然后再执行查询连续支付天数的语句。

假设我们有以下的表结构来记录用户支付情况:

  1. CREATE TABLE payments (
  2. id INTEGER PRIMARY KEY AUTOINCREMENT,
  3. user_id INTEGER NOT NULL,
  4. payment_date DATE NOT NULL,
  5. order_no VARCHAR(20) NOT NULL,
  6. UNIQUE(user_id, payment_date, order_no)
  7. );

其中,user_id表示用户的ID,payment_date表示支付日期,order_no表示订单号。我们可以使用以下的SQL语句来查询每个用户的连续支付天数:

  1. SELECT user_id,
  2. COUNT(*) AS consecutive_days
  3. FROM
  4. (SELECT user_id,
  5. payment_date,
  6. ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY payment_date) -
  7. ROW_NUMBER() OVER (PARTITION BY user_id, DATE_SUB(payment_date, INTERVAL 1 DAY)
  8. ORDER BY payment_date) AS diff
  9. FROM
  10. (SELECT DISTINCT user_id, payment_date, order_no FROM payments) t1) t2
  11. GROUP BY user_id,
  12. diff
  13. HAVING consecutive_days > 0
  14. ORDER BY user_id,
  15. consecutive_days DESC;

该查询语句与之前查询连续支付天数的语句类似,只是在内层查询中加入了去重的逻辑。

在Peewee中,可以使用以下方式来执行该查询语句:

  1. from peewee import *
  2. db = MySQLDatabase('my_database', user='my_username', password='my_password',
  3. host='127.0.0.1', port=3306)
  4. class Payments(Model):
  5. user_id = IntegerField()
  6. payment_date = DateField()
  7. order_no = CharField(max_length=20)
  8. class Meta:
  9. database = db
  10. constraints = [SQL('UNIQUE(user_id, payment_date, order_no)')]
  11. query = """
  12. SELECT user_id,
  13. COUNT(*) as consecutive_days
  14. FROM
  15. (SELECT user_id,
  16. payment_date,
  17. ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY payment_date) -
  18. ROW_NUMBER() OVER (PARTITION BY user_id, DATE_SUB(payment_date, INTERVAL 1 DAY)
  19. ORDER BY payment_date) AS diff
  20. FROM
  21. (SELECT DISTINCT user_id, payment_date, order_no FROM payments) t1) t2
  22. GROUP BY user_id,
  23. diff
  24. HAVING consecutive_days > 0
  25. ORDER BY user_id,
  26. consecutive_days DESC;
  27. """
  28. result = db.execute_sql(query)
  29. for row in result.fetchall():
  30. print(row[0], row[1])

在上述代码中,先定义了一个名为Payments的Model类,对应了我们的payments表。然后执行查询语句并遍历结果集输出。

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=2343

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?