postgresql - 在 PostgreSQL 中搜索字符串中的值

标签 postgresql magento magento-1.9

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

订单表(Sales_flat_order) - 包含订单详情 列 - order_id、Created_date、Customer_email

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

下面是我为按电子邮件 ID 过滤的特定客户加入订单和商品表的示例数据。

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

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

以下是我面临的困难,

1) 由于每个订单都可以包含多个产品,因此我如何将项目行与之前的订单项目进行比较。我尝试使用 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"

任何指导都会有很大帮助。我使用 PostgreSQL 作为我的数据库。

最佳答案

@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; 

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

关于postgresql - 在 PostgreSQL 中搜索字符串中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58136855/

相关文章:

SQL - 如何在幂等插入示例中使用连接而不是 EXISTS 和 NOT EXISTS

postgresql - 如何管理从 sidekiq 到 PostgreSQL 的连接池?

magento - Magento 订单确认页面上扣除优惠券/折扣的小计

php - Magento 从没有 ?SID= 的 ID 中获取类别 url

postgresql - 有什么办法可以替换 postgresql 中的 like 条件吗?

postgresql - 字段显示为 null 或空字符串,但我无法选择它

magento - 在 Magento 中, block 如何从模型中获取数据?

mysql - 哪些数据库权限需要 Magento 中的 Reindex 工具?

templates - 在 Magento 中获取皮肤路径?

docker - 缺少对以下路径的写许可权:/var/www/html/pub/media