在 PostgreSQL 中搜索字符串中的值

Searching a value in a string in PostgreSQL

我在 Magento(1.9) 上有一个网站 运行,我需要找出客户再次购买相同产品的平均时间以及购买相同产品的客户百分比。

Orders table(Sales_flat_order) - 包含订单详细信息 列 - order_id、Created_date、Customer_email

商品 table(Sales_Flat_Order_item) - 特定订单中的商品,如果用户购买 6 件商品,则商品 table 将有 6 个相同的条目 order_id. 列 - items_id、Order_id(FK)、item_sku(差异产品不同)

下面是我加入订单和商品的示例数据 tables 为特定客户筛选的电子邮件 ID。

例如 order_id“92224”有 4 行表示该订单中购买了 4 件商品,item_sku 指的是商品名称/其唯一 ID。

现在我想找出在订单“98651”中购买相同产品所花费的平均时间 again.So 用户购买了产品 items_sku(“2996”)在第一个 order.So 中,平均时间将是这两个订单之间的日期差异。

以下是我面临的困难,

1) 由于每个订单可以包含多个产品,因此我如何将项目行与之前的订单进行比较 items.I 已经尝试使用 LIKE 和 ILIKE 但它似乎不起作用并尝试使用 STR_AGG(item_sku,',') 与 LIKE 但没有找到任何结果。

2) 不仅针对特定客户,还需要针对每一位客户完成此操作。

Order_id     Order_date         Item_sku
92224   "2016-11-11 17:18:15"   "3001"
92224   "2016-11-11 17:18:15"   "2933"
92224   "2016-11-11 17:18:15"   "2992-config"
92224   "2016-11-11 17:18:15"   "2996"
94926   "2016-11-25 10:01:30"   "3008"
98651   "2016-12-14 18:11:16"   "2992-config"
98651   "2016-12-14 18:11:16"   "2996"
99645   "2016-12-20 13:00:34"   "3001"
99645   "2016-12-20 13:00:34"   "2933"
114578  "2017-02-28 15:32:54"   "2931"
114578  "2017-02-28 15:32:54"   "0294"
114578  "2017-02-28 15:32:54"   "0297"
114578  "2017-02-28 15:32:54"   "0296"
114578  "2017-02-28 15:32:54"   "2992-config"
131754  "2017-05-15 17:23:35"   "3296"
131968  "2017-05-16 18:30:52"   "3300"
133186  "2017-05-22 14:03:07"   "3004"
133186  "2017-05-22 14:03:07"   "3069-bio"
133186  "2017-05-22 14:03:07"   "3421-bio-config"
137484  "2017-06-13 14:07:28"   "3605"
137484  "2017-06-13 14:07:28"   "3604"
141709  "2017-07-03 16:20:30"   "3603"
141709  "2017-07-03 16:20:30"   "3606"
141709  "2017-07-03 16:20:30"   "2936"
141709  "2017-07-03 16:20:30"   "3422-bio"
141977  "2017-07-04 16:31:37"   "2936"
145194  "2017-07-17 15:22:41"   "3603"
145194  "2017-07-17 15:22:41"   "3604"
151651  "2017-08-11 11:43:38"   "3809"
161334  "2017-09-14 15:53:30"   "3670"
161334  "2017-09-14 15:53:30"   "3604"
161334  "2017-09-14 15:53:30"   "3603"

任何指导都非常有用help.I我正在使用 PostgreSQL 作为我的数据库。

我对 magento 一无所知,但这就是我在 postgres 中解决这个问题的方法,给定你的输入数据:

SELECT item_sku, avg(elapsed_s) as avg_s
FROM (
  select order_id, 
         order_date, 
         item_sku, 
         extract(epoch from (order_date - lag(order_date) 
            OVER (partition by item_sku order by order_date))) as elapsed_s
  FROM orders
) sub
WHERE elapsed_s IS NOT NULL
GROUP BY item_sku
;
  item_sku   |    avg
-------------+-----------
 2933        |   3354139
 2936        |     87067
 2992-config | 4705639.5
 2996        |   2854381
 3001        |   3354139
 3603        |   3152790
 3604        |   4020781
(7 rows)

这是购买同一商品的平均时间(以秒为单位)。在内部查询中,我们使用滞后 window 函数,按 item_sku 分区以将当前行与该项目的前一个条目进行比较。外部查询只是按 item_sku.

分组

如果您要添加多个用户,只需将 partition by 子句更改为 partition by user_id, item_sku,然后按 user_id 和 item_sku 进行分组。

@Jeremy 实际上提供了一个很好的例程,但结果以经过的秒数为单位。但是,这可能不是最有用的格式。您可以直接使用日期减法和间隔,而不是使用纪元。

select item_sku
     , extract('days' from average_time) || ' days ' ||  extract('hour' from average_time) || ' hours' average_time
  from (    
        select item_sku,avg(intv) average_time   
          from (
                select order_date, 
                       item_sku, 
                       (order_date - lag(order_date) 
                                     OVER (partition by item_sku order by order_date)) as intv
                  FROM sales_flat_order_item
               ) intv_diff
         where intv is not null
         group by item_sku
         order by item_sku) avg_time; 

最外层的查询只是将结果格式化为天数和小时数。没有它,结果可能会出现(并且会出现)到小数秒。