0

我有 2 个表我想加入以探索最受欢迎的位置组合,按不同的 ID,按计数排序。我从 l 获得位置,从 d 获得日期。此连接的结果将是:

  id loc_id location date
    1  111    NYC      20200101
    1  222    LA       20200102
    2  111    NYC      20200103
    2  333    LON      20200103
    3  444    NYC      20200105
    4  444    LA       20200106
    4  555    PAR      20200107
    5  111    NYC      20200110
    5  222    LA       20200111

如果可能,我想使用 STRING_AGG,但 WITHIN 语句出错 -

'期待')'但在里面

..(我为此使用 BigQuery)。这是我到目前为止所尝试的。

 SELECT t.combination, count(*) count
    FROM (
      SELECT
        STRING_AGG(location, ',') WITHIN GROUP (ORDER BY d.date) combination
      FROM location as l
    JOIN date d
        USING (loc_id)
    GROUP BY id
    ) t
    WHERE date BETWEEN 20190101 AND 20200228 GROUP BY t.combination
    ORDER BY  count DESC;

我想最终得到类似的东西:

combination count
NYC, LA     3
NYC, LON    1
LA,  PAR    1
NYC         1

如果有另一种方法,我很乐意从 string_agg 更改。

4

1 回答 1

1

正确的 BQ 语法是:

SELECT t.combination, count(*) count
FROM (SELECT STRING_AGG(location, ',' ORDER BY d.date) as combination
      FROM location l JOIN
           date d
           USING (loc_id)
     GROUP BY id
    ) t
WHERE date BETWEEN 20190101 AND 20200228
GROUP BY t.combination
ORDER BY count DESC;

请注意,您的JOIN情况看起来仍然是错误的。

如果您使用日期,那么我会期望DATE常量。

而且您的日期过滤代码在外部查询中不起作用,因为您没有在内部查询中选择日期。您可能希望在内部查询中进行过滤。

这个答案没有解决这些问题。

BigQuery 有很好的文档。没有WITHIN GROUPfor STRING_AGG()

于 2021-03-05T13:35:16.000 回答