我正在尝试将每个事件包含多行的表压缩到一个较小的表中,该表包含每个事件中的关键子事件的计数。事件是根据列之间的唯一组合定义的。
作为一个具体的例子,假设我有以下数据,涉及客户在不同日期购买不同商品的各个商店:
cust date store item_type
a 1 Main St 1
a 1 Main St 2
a 1 Main St 2
a 1 Main St 2
b 1 Main St 1
b 1 Main St 2
b 1 Main St 2
c 1 Main St 1
d 2 Elm St 1
d 2 Elm St 3
e 2 Main St 1
e 2 Main St 1
a 3 Main St 1
a 3 Main St 2
我想将数据重组为一个表,该表在给定的每一天每次客户访问时包含一行,并具有适当的计数。我试图了解如何使用SQLite将其浓缩为:
Index cust date store n_items item1 item2 item3 item4
1 a 1 Main St 4 1 3 0 0
2 b 1 Main St 3 1 2 0 0
3 c 1 Main St 1 1 0 0 0
4 d 2 Elm St 2 1 0 1 0
5 e 2 Main St 2 2 0 0 0
6 a 3 Main St 2 1 1 0 0
我可以在excel中为这个简单的例子做这个(以sumproduct(cutomer * date)开头,如建议here,然后在此列上累积和生成Index,然后countif和countifs生成所需的计数) 。
Excel非常适合为数千行执行此操作,因此我正在寻找使用SQLite的解决方案。
可悲的是,我的SQLite功夫很弱。我认为this是我找到的最接近的,但我很难理解如何适应它。
当我尝试通过生成唯一索引开始更基本的方法时:
CREATE UNIQUE INDEX ui ON t(cust, date);
我明白了:
Error: indexed columns are not unique
我非常感谢从哪里开始的任何帮助。非常感谢提前!
答案 0 :(得分:0)
要为每个唯一的列值组合创建一个结果记录,请使用GROUP BY。
该组中的记录数可以使用COUNT。
要计算特定的项类型,请使用类似item_type=x
的布尔表达式,它返回0或1,并对组中的所有记录求和:
SELECT cust,
date,
store,
COUNT(*) AS n_items,
SUM(item_type = 1) AS item1,
SUM(item_type = 2) AS item2,
SUM(item_type = 3) AS item3,
SUM(item_type = 4) AS item4
FROM t
GROUP BY cust,
date,
store