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

Posted

技术标签:

【中文标题】在 SQL 中,如何为另一列的每个不同值创建新的值列?【英文标题】:In SQL, how do I create new column of values for each distinct values of another column? 【发布时间】:2017-07-19 16:54:06 【问题描述】:

类似这样的: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;

【问题讨论】:

请给出一个玩具数据库(以“创建表...”和“插入...”的几行的形式)和期望的结果。 我设法通过 SELECT 和 JOIN 做到这一点,虽然我不确定它是否比你的建议更有效,但现在我正在寻找如何通过不同的日子计算不同的数字并通过不同的 ' 3' 和 '4' 通过不同的日期。 如果你有一些几乎可以工作的东西,请展示它。如果它完全做到了你想要的并且你担心效率,那么代码审查网站可能就是你想要的。 codereview.stackexchange.com @Yunnosch 你知道拆分计数吗?只有相同值和相同日期的行的计数相同? 如果你能展示你的数据和预期输出的例子 - 你有更多的机会得到正确的答案!您可以阅读如何显示您遇到问题的代码和数据的Minimal, Complete, and Verifiable example,然后我们可以尝试帮助解决具体问题。你也可以阅读How to Ask。 【参考方案1】:

您给出的查询最好使用窗口函数编写:

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;

【讨论】:

***.com/questions/13235981/… 。这个问题和我在问题中链接的问题回答了我的问题,但我现在不确定它们结合起来的效率。话虽如此,PARTITION 是做什么的? 它肯定更短,而且有效。谢谢,虽然不确定性能,也许你知道或者我应该做一些深入的研究。否则,两个查询几乎同时完成。 ~3 秒

以上是关于在 SQL 中,如何为另一列的每个不同值创建新的值列?的主要内容,如果未能解决你的问题,请参考以下文章

在包含记录的现有表中,如何创建一个新的 datetime2(2) 列并使用基于另一列的值填充它?

根据不同数据类型的另一列设置一列的默认值

SQL如何查询出某一列中不同值出现的次数?

C# SQL:如何为 SQL 表列中的每个不同值启动代码?

SQL Server:选择一列的计数,同时检查另一列中的不同值

仅当值存在于 SQL 的另一列中时,如何选择列的值?