You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL统计多列中各SKU的出现次数及距上次请求时长

问题

现有一张记录物品请求的表格,结构如下:

Date, Item1, Item2, Item3, Item4

Item列存储SKU编号(示例用物品名称替代),表内数据示例:

09/13/2022, Stapler, Tape, Glue,
10/02/2022, Screws, Nails, Hammer, Screwdriver
12/12/2022, Paint, Brush, Dropcloth, Roller
01/12/2023, Glue, Tape, Stapler
03/23/2023, Roller, Brush, Paint, Dropcloth
04/14/2023, Screwdriver, Paint, Glue, Screws

已知:

  • 物品输入顺序无规律
  • SKU种类超100种

需要统计每个SKU的出现次数,以及距上次请求的天数,期望输出格式如下:

Hammer, 2, n_days
Stapler, 2, n_days
Paint, 3, 22
解决方案

用Python处理的话,步骤如下:

  1. 将宽表转换为窄表:把每行的多个Item拆成单独的(日期,SKU)记录,过滤空值
  2. 按SKU分组,收集所有请求日期并排序
  3. 统计出现次数,计算最后两次请求的间隔天数(若仅出现一次,可标记为N/A)

代码实现

from datetime import datetime
from collections import defaultdict

# 示例数据
raw_data = [
    "09/13/2022, Stapler, Tape, Glue,",
    "10/02/2022, Screws, Nails, Hammer, Screwdriver",
    "12/12/2022, Paint, Brush, Dropcloth, Roller",
    "01/12/2023, Glue, Tape, Stapler",
    "03/23/2023, Roller, Brush, Paint, Dropcloth",
    "04/14/2023, Screwdriver, Paint, Glue, Screws"
]

date_format = "%m/%d/%Y"
sku_date_records = defaultdict(list)

# 解析数据,按SKU收集日期
for line in raw_data:
    segments = [s.strip() for s in line.split(",")]
    req_date = datetime.strptime(segments[0], date_format)
    # 过滤空的SKU条目
    skus = [sku for sku in segments[1:] if sku]
    for sku in skus:
        sku_date_records[sku].append(req_date)

# 计算统计结果
output = []
for sku, dates in sku_date_records.items():
    sorted_dates = sorted(dates)
    count = len(sorted_dates)
    # 计算间隔天数
    if count >= 2:
        days_since_last = (sorted_dates[-1] - sorted_dates[-2]).days
    else:
        days_since_last = "N/A"
    output.append(f"{sku}, {count}, {days_since_last}")

# 打印结果
for line in output:
    print(line)

输出示例(部分)

Stapler, 2, 121
Paint, 3, 22
Glue, 3, 93

内容的提问来源于stack exchange,提问作者ppetree

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 21:54:57