day.js 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. const req = require('../../utils/request');
  2. const company = getApp().globalData.company;
  3. async function getConsecutiveSignIns(params) {
  4. let { userId } = params; // 从参数中获取用户ID
  5. // 构建 SQL 查询
  6. let sql = `
  7. WITH ranked_sign_ins AS (
  8. SELECT
  9. "user",
  10. "createdAt",
  11. DATE("createdAt") - INTERVAL '1 day' * ROW_NUMBER() OVER (PARTITION BY "user" ORDER BY "createdAt") AS grp,
  12. (CASE WHEN DATE("createdAt") = CURRENT_DATE OR (DATE("createdAt") + INTERVAL '1 day') = CURRENT_DATE THEN TRUE ELSE FALSE END) "isToday"
  13. FROM
  14. "EventLog"
  15. WHERE "user" = '${userId}'
  16. ),
  17. continuous AS (
  18. SELECT "user", grp
  19. FROM ranked_sign_ins
  20. WHERE "isToday" = TRUE
  21. GROUP BY "user", grp
  22. LIMIT 1
  23. ),
  24. grouped_sign_ins AS (
  25. SELECT
  26. ranked_sign_ins."user",
  27. ranked_sign_ins.grp,
  28. COUNT(*) AS consecutive_days
  29. FROM ranked_sign_ins
  30. LEFT JOIN continuous
  31. ON continuous.grp = ranked_sign_ins.grp AND continuous."user" = ranked_sign_ins."user"
  32. WHERE continuous.grp IS NOT NULL
  33. GROUP BY ranked_sign_ins."user", ranked_sign_ins.grp
  34. )
  35. SELECT
  36. "user",
  37. consecutive_days
  38. FROM grouped_sign_ins
  39. GROUP BY "user", consecutive_days;
  40. `;
  41. // 执行 SQL 查询
  42. let res = await req.customSQL(sql);
  43. return res;
  44. }
  45. module.exports = {
  46. getConsecutiveSignIns
  47. };