我正在使用Pivot函数查询BigQuery表,并注意到与原始表相比,Pivot结果中缺少一些行.汇总不同事件名称的事件计数是一个非常基本的查询.

透视查询如下所示:

SELECT *
FROM (SELECT *
      FROM `my-project.my-dataset.my-table`
      WHERE date = "2023-05-15") 
PIVOT (SUM(eventcount) AS convs 
       FOR eventname IN ("page_view",
                         "select_item",
                         "view_item",
                         "Store_List_event"))
ORDER BY date,
         useragebracket,
         usergender

与简单的SELECT *相比,Pivot查询一天中缺少一些行.我能够找到丢失的行,但没有一致的模式来解释为什么这些行没有正确显示,此外,一些列的值与其他行非常相似.

下面是一个Souretable示例:

date eventname useragebracket usergender eventcount screenpageviews sessions totalusers
2023-05-15 page_view x-y xyz 1348 1348 194 175
2023-05-15 view_item x-y xyz 34 0 15 15
2023-05-15 select_item x-y xyz 38 0 15 15
2023-05-15 Store_List_event x-y xyz 47 0 15 15

该查询给出了以下结果:

date useragebracket usergender screenpageviews sessions totalusers convs_page_view convs_select_item convs_view_item convs_Store_List_event
2023-05-15 x-y xyz 1348 194 175 1348 null null null
2023-05-15 x-y xyz 0 15 15 null 38 34 47

我的理解是,因为在周围的SELECT查询中没有group by语句,所以每个单独的事件名的每一行都应该返回,并且始终只填充一个透视列.除了some个事件名称之外,这似乎是可行的,但这些事件名称每天都是不同的名称.唯一的相似之处似乎是这些行的会话/用户数.

根据这一 idea ,我预计会有以下输出:

date useragebracket usergender screenpageviews sessions totalusers convs_page_view convs_select_item convs_view_item convs_Store_List_event
2023-05-15 x-y xyz 1348 194 175 1348 null null null
2023-05-15 x-y xyz 0 15 15 null 38 null null
2023-05-15 x-y xyz 0 15 15 null null 34 null
2023-05-15 x-y xyz 0 15 15 null null null 47

谁能解释一下这种行为,并告诉我如何避免这种行为?

推荐答案

在处理Pivot时,最好使用显式版本,因为它更清楚发生了什么.您当前查询的显式翻译如下:

SELECT date,
       useragebracket,
       usergender,
       screenpageviews,
       sessions,
       totalusers,
       MAX(CASE WHEN eventname = 'page_view'        THEN eventcount) END AS convs_page_view,
       MAX(CASE WHEN eventname = 'view_item'        THEN eventcount) END AS convs_view_item,
       MAX(CASE WHEN eventname = 'select_item'      THEN eventcount) END AS convs_select_item,
       MAX(CASE WHEN eventname = 'Store_List_event' THEN eventcount) END AS convs_Store_List_event
FROM (SELECT *
      FROM `my-project.my-dataset.my-table`
      WHERE date = "2023-05-15") tab
GROUP BY date,
         useragebracket,
         usergender,
         screenpageviews,
         sessions,
         totalusers
ORDER BY date,
         useragebracket,
         usergender

在本例中,您看起来根本不需要透视表,而是只需要CASE个表达式来 Select 不同字段中的数据.

SELECT date,
       useragebracket,
       usergender,
       screenpageviews,
       sessions,
       totalusers,
       CASE WHEN eventname = 'page_view'        THEN eventcount END AS convs_page_view,
       CASE WHEN eventname = 'view_item'        THEN eventcount END AS convs_view_item,
       CASE WHEN eventname = 'select_item'      THEN eventcount END AS convs_select_item,
       CASE WHEN eventname = 'Store_List_event' THEN eventcount END AS convs_Store_List_event
FROM `my-project.my-dataset.my-table`
WHERE date = "2023-05-15"
ORDER BY date,
         useragebracket,
         usergender

Sql相关问答推荐

按postquist中的日期查询json列

如何使用PostGIS从单个表中 Select 所有相交面组

SQL—如何在搜索的元素之后和之前获取元素?

BigQuery`喜欢ANY‘和`不喜欢ANY’

在postgres中动态计算出现次数并插入到json中

如何利用单列历史SQLsnowflake获得合并结果

从字符串中删除";1、";和";2,";,而不删除";11、";和";12、";

如何将我的联接数据放入每个用户每月多行的列中?

在一个子查询中签入ID';S,如果未返回,则签入另一个子查询

从给定数据中查找下一个工作日期

group-by-clause具有特定列,而不是oracle的toad中的all

使用临时表判断记录是否存在 - 如果存在则执行相同的操作

使用多个数据库调用重载 CQRS 模式

SQL SUM Filter逻辑解释

SQL 语句将一列中的值与另一列中的不同值相加,同时按第三列进行分组?

在presto sql中解析带有区域的时间格式

验证某个日期前后的连续代码

Postgres更新增量之间的差异

每组跨行曲折?

当我按 PK 分组时,该表中的所有列在每个组中都具有相同的值.那么为什么 SQL Server 需要对这些列进行聚合呢?