我希望从客户的第一次购买日期开始,在SQL中找到他们的回购频率

我希望从客户的第一次购买日期开始,在SQL中找到他们的回购频率,sql,oracle,oracle-sqldeveloper,Sql,Oracle,Oracle Sqldeveloper,我试图找到客户从第一次订购日期起的回购利率。例如,2016年,有多少客户在第一次购买后的第1-365天内购买了1X,有多少客户购买了两次,等等 我有一个交易详情表,如下所示: txn_date Customer_ID Transaction_Number Sales 1/2/2019 1 12345 $10 4/3/2018 1 65890 $20 3/22/2019 3

我试图找到客户从第一次订购日期起的回购利率。例如,2016年,有多少客户在第一次购买后的第1-365天内购买了1X,有多少客户购买了两次,等等

我有一个交易详情表,如下所示:

txn_date Customer_ID  Transaction_Number    Sales 
1/2/2019    1           12345                $10
4/3/2018    1           65890                $20
3/22/2019   3           64453                $30
4/3/2019    4           88567                $20
5/21/2019   4           85446                $15
1/23/2018   5           89464                $40
4/3/2019    5           99674                $30
4/3/2019    6           32224                $20
1/23/2018   6           46466                $30
1/20/2018   7           56558                $30

我能够找到在2016年购物的客户以及他们在2016年回购了多少次,但我需要找到在2016年购物的客户以及他们从第一次购买日期回来了多少次

我需要一个查询的起点,我不知道如何在我的SQL代码中构建这个逻辑

任何帮助都将不胜感激

我正在使用以下查询:

WITH by_year
AS (SELECT
  Customer_ID,
  to_char(txn_date, 'YYYY') AS visit_year
FROM table
GROUP BY Customer_ID, to_char(txn_date, 'YYYY')),
with_first_year
AS (SELECT
  Customer_ID,
  visit_year,
  FIRST_VALUE(visit_year) OVER (PARTITION BY Customer_ID ORDER BY visit_year) AS first_year
FROM by_year),
with_year_number
AS (SELECT
  Customer_ID,
  visit_year,
  first_year,
  (visit_year - first_year) AS year_number
FROM with_first_year)
SELECT
  first_year  AS first_year,
  SUM(CASE WHEN year_number = 0 THEN 1 ELSE 0 END) AS year_0,
  SUM(CASE WHEN year_number = 1 THEN 1 ELSE 0 END) AS year_1,
  SUM(CASE WHEN year_number = 2 THEN 1 ELSE 0 END) AS year_2,
  SUM(CASE WHEN year_number = 3 THEN 1 ELSE 0 END) AS year_3,
  SUM(CASE WHEN year_number = 4 THEN 1 ELSE 0 END) AS year_4,
  SUM(CASE WHEN year_number = 5 THEN 1 ELSE 0 END) AS year_5,
  SUM(CASE WHEN year_number = 6 THEN 1 ELSE 0 END) AS year_6,
  SUM(CASE WHEN year_number = 7 THEN 1 ELSE 0 END) AS year_7,
  SUM(CASE WHEN year_number = 8 THEN 1 ELSE 0 END) AS year_8,
  SUM(CASE WHEN year_number = 9 THEN 1 ELSE 0 END) AS year_9
FROM with_year_number
GROUP BY first_year
ORDER BY first_year

使用窗口函数和聚合:

select cnt, count(*), min(customer_id), max(customer_id)
from (select customer_id, count(*) as cnt
      from (select td.*,
                   min(txn_date) over (partition by Customer_ID) as min_txn_date
            from transaction_detail td
           ) td
      where txn_date >= min_txn_date and txn_date < min_txn_date + interval '365' day
      group by customer_id
     ) c
group by cnt
order by cnt;

因此,根据我的理解,您想知道2016年首次购买并自购买之日起一年或更长时间后回购的不同人士的数量

Select * from
(
  Select customer_id, 
         Floor(months_between(txn_date, lead_txn_date)/12) as num_years
  From
  (
   Select customer_id, 
          txn_date, 
          row_number() over (partition by Customer_ID order by txn_date) as rn, 
          lead(txn_date) over (partition by Customer_ID order by txn_date) as lead_txn_date
     From your_table
  )
    Where txn_date >= date '2016-01-01' 
      and txn_date < date '2017-01-01'
      and rn = 1
      And months_between(txn_date, lead_txn_date) >= 12
)
Pivot
(
  Count(1) for num_year in (1,2,3,4)
)
最终,我们将确定客户第一次购买和第二次购买之间的年数。第一次购买必须在2016年


干杯

这给了我一个错误:ORA-01873:间隔的前导精度太小01873。00000-间隔的前导精度太小*原因:间隔的前导精度太小,无法存储指定的间隔*操作:增加间隔的前导精度或指定前导精度较小的间隔。第11行第77列出错我已根据您在原始文档中的查询更新了我正在使用的查询question@Somya . . . 您可以将min_txn_date+interval“365”day替换为min_txn_date+365,但这不是必需的。此查询没有给出我想要的结果:hi@Somya请包含所有正在查询的表/视图的样本数据以及所需的输出;这有助于更好地理解需求。我需要找到2016年购物的客户,以及他们从**首次购买日期回来的次数。他们的第一个购买日期可能是2016年的任何日期,因此从该日期起365天。这就是为什么提供样本数据和预期输出是一个很好的做法。我不知道如何输入结果,而且查询也没有给我任何结果