在SQL中,如何为另一列的每个不同值创建新的值列?

时间:2017-07-19 16:54:06

标签: sql join count google-bigquery partition-by

像这样:SQL How to create a value for a new column based on the count of an existing column by groups?

但我有两个以上的不同价值观。我有一些变量n个不同的值,所以我并不总是知道我有很多不同的计数。

然后在原始表中,我希望每行“3”,“4”等具有计数,即具有“3”的所有行将具有相同的计数,所有具有“4”的行将具有相同的计数等。

编辑:另外我如何通过不同的日期分割计数,即每个不同的值分别为“2017-07-19”?

edit2:我是这样做的,但现在我需要在不同的日期拆分它。

edit3:这是我通过日期分割的方式。

#standardSQL
SELECT * FROM
(SELECT * FROM table1) main
LEFT JOIN (SELECT event_date, value, COUNT(value) AS count 
FROM table1
GROUP BY event_date, value) sub ON main.value=sub.value 
AND sub.event_date=SAFE_CAST(main.event_time AS DATE)

edit4:我希望PARTITION BY更好地记录在某处。似乎没有什么东西可以广泛写在BigQuery或任何带有详细文档的东西上

#standardSQL
SELECT
  *,
  COUNT(*) OVER (PARTITION BY event_date, value) AS cnt
FROM table1;

1 个答案:

答案 0 :(得分:2)

您提供的查询最好使用窗口函数编写:

SELECT t1.*, COUNT(*) OVER (PARTITION BY value) as cnt
FROM table1 t1;

我不确定这是否能回答你的问题。

如果您还想要计算另一列,则可以使用条件聚合:

SELECT t1.*,
       COUNT(*) OVER (PARTITION BY value) as cnt,
       SUM(CASE WHEN datecol = '2017-07-19' THEN 1 ELSE 0 END) OVER (PARTITION BY value) as cnt_20170719
FROM table1 t1;