我有一个简单的'Action'表,用于记录如下所示的用户操作:
{
label (varchar),
timestamp
}
为用户完成的每个操作保存记录。
我现在需要输出一个如下所示的报告:
Date, Label1Count, Label2Count, Label3Count, ...
dd/mm/yy, 34, 44, 55, ...
dd/mm/yy, 34, 44, 55, ...
dd/mm/yy, 34, 44, 55, ...
其中日期是操作发生的日期,每个标签标题是我记录的标签之一。
我可以输出类似没有probs的东西:
label, date, count
label, date, count
...
并对其进行排序,以便将标签组合在一起,然后将日期组合在一起。
然后我需要将其复制并粘贴到Excel中以匹配所需的视图。
我是如何使用纯SQL获得第一个视图的?我可以使用python和SQL的组合来做到这一点,但我确信SQL本身可以做到吗?
由于
答案 0 :(得分:1)
你可以在PostGreSQL中使用crosstab
,但我不喜欢它。
所以我改用这种模式......
SELECT
timestamp,
SUM(CASE WHEN label = 'x' THEN 1 ELSE 0 END) AS label_x_count,
SUM(CASE WHEN label = 'y' THEN 1 ELSE 0 END) AS label_y_count,
SUM(CASE WHEN label = 'z' THEN 1 ELSE 0 END) AS label_z_count
FROM
yourTable
GROUP BY
timestamp
显然,这只有在你知道所有转移的标签时才有效。
如果您没有编写所有标签,并且您希望结果集具有动态列数,则需要动态SQL (编写SQL的代码,特别是不同标签的新代码行) 。没有一个静态查询可以为您做到这一点。
因为当您在设计时不知道不同的标签值时需要动态SQL,所以规范化数据集通常实际上是数据层中的最佳方法。然后,您的客户端代码可以将该规范化数据集转换为模型层中的平面文件数据集。或类似的。
出于这个原因,我经常建议不要在SQL环境中转动数据。
答案 1 :(得分:0)
这是表格旋转。使用纯sql实现起来并不容易。但是,如果标签的个案数量已修复,您可以在SELECT CASE WHEN语句中成功。如果标签的类型没有修复,你应该去寻找别的东西。只有一些sql引擎没有解决方案。 看看这个: http://www.postgresql.org/docs/9.1/static/tablefunc.html