【问题标题】:PSQL: find invoice that was created in less than 8 months of another invoicePSQL:查找另一张发票在不到 8 个月内创建的发票
【发布时间】:2021-03-31 07:16:36
【问题描述】:
Table: Invoice
user_id
created_at

目标是找到另一张发票在不到 8 个月的时间内创建的发票,这两张发票都属于同一用户。

示例:

Invoice 2: created_at: 2020-12-01 user_id: 1
Invoice 1: created_at: 2020-08-01 user_id: 1

Invoice 4: created_at: 2020-12-01 user_id: 2
Invoice 3: created_at: 2019-12-01 user_id: 2

Invoice 7: created_at: 2019-09-01 user_id: 3
Invoice 6: created_at: 2019-07-01 user_id: 3
Invoice 5: created_at: 2019-06-01 user_id: 3

查询应返回发票 2,因为在发票 1 之前不到 8 个月内创建了另一张发票(发票 1)。

查询还应返回发票 7,因为在发票 7 之前不到 8 个月内已创建了另一张发票(发票 6)。

查询还应返回发票 6,因为在发票 6 之前不到 8 个月内创建了另一张发票(发票 5)。

到目前为止:

Invoice.where(created_at: 8.months.ago..Time.now).group_by(&:user_id).select { |k, v| v.size > 1 }

select * from invoices where created_at BETWEEN ('2020-04-21 14:05:57.009849' AND '2020-12-21 14:05:57.009949')

我的方法的问题是它只能在过去 8 个月内找到,而不是在一般情况下。而且它使用的是ruby+sql,只有SQL才能更好。

【问题讨论】:

    标签: ruby-on-rails ruby postgresql psql


    【解决方案1】:

    这应该可行:

    WITH cte AS (
        SELECT  user_id
            ,   invoice
            ,   created_at
            ,   LAG(created_at) OVER (PARTITION BY user_id ORDER BY created_at) previous
        FROM    invoice
    )
    SELECT  *
    FROM    cte
    WHERE   AGE(created_at, previous) <= INTERVAL '8 months';
    

    【讨论】:

      【解决方案2】:

      我不太了解要求,您需要退回所有发票还是仅属于特定用户的发票? 如果对于某些特定用户,也许可以尝试这样的事情?

      def invoices_in_last_8_months(user, other_invoice)
        Invoice.where(user: user, created_at: 8.months.ago..other_invoice.created_at)
      end
      

      【讨论】:

      • 你好。它不起作用,因为应该动态找到另一张发票。
      猜你喜欢
      • 2020-06-09
      • 1970-01-01
      • 1970-01-01
      • 2018-11-05
      • 1970-01-01
      • 1970-01-01
      • 2019-03-07
      • 2012-08-11
      • 1970-01-01
      相关资源
      最近更新 更多