SQL Count Distinct Value Oldest DateTime

Posted

技术标签:

【中文标题】SQL Count Distinct Value Oldest DateTime【英文标题】: 【发布时间】:2019-08-07 03:24:04 【问题描述】:

我正在处理两个数据集,并尝试在输出中创建一个包含唯一值计数的新列。在我的查询中,我有多个 Case When 子句,其中一个表中的唯一数字字符串将指示输出中的唯一字符串/句子值。在 Else 语句中,存在于第二个表中但不存在于第一个表中的任何这些唯一数字字符串(第二个表中的最后一列,第一个表中的第一列)将导致输出中的总计数。我的问题是计数应该只针对不同用户 ID 的最旧的 DateTime 实例。我构建了一个边缘案例来检查我的输出是否正常工作,如果他们有多个相同标识符但不同字符串的实例,它会输出用户 ID 的计数。我希望输出仅根据最早的 DateTime 对每个不同用户的每个标识符计数一次。

某些数据可能如下所示:

1581 | billy | abcd | red dead | company1
1903 | bob   | defg | halo 3   | company2
5849 | lilly | hijk | fortnite | company3
1903 | bob   | hijk | fortnite | company3

某些数据可能如下所示:

d83j | 2012-09-28 | 2012-09-28 09:00:00.00 | abcd | 1010
np50 | 2012-09-28 | 2012-09-28 10:45:00.00 | abcd | 1581
j99p | 2012-09-28 | 2012-09-28 11:00:00.00 | abcd | 1581
rn2n | 2012-09-28 | 2012-09-28 18:30:00.00 | defg | 1903
rn2n | 2012-09-28 | 2012-09-28 15:30:00.00 | defg | 1903
rn2n | 2012-09-28 | 2012-09-28 07:30:00.00 | defg | 6211
44ko | 2012-09-28 | 2012-09-28 18:30:00.00 | hijk | 5849

这是我目前的查询:

SELECT 
  F.Identifier, F.Videogame, F.Developer,
CASE WHEN S.String='1581' THEN 'Made by billy'
     WHEN S.String='1903' THEN 'Made by bob'
     WHEN S.String='5849' THEN 'Made by lilly'
     ELSE 'worked on by someone else' END AS Final_Name,
     COUNT(distinct S.User_ID) as Count
FROM 
  table1 as F
JOIN 
  table2 as S
ON
  F.Identifier=S.Identifier
GROUP BY
  F.Identifier, F.Videogame, F.Developer, Final_Name

我试图在计数周围包含有和 where 子句并子查询计数 S.User_ID,但我所做的一切都没有让我得到我想要实现的目标。

现在的实际输出如下所示:

abcd | red dead | company1 | worked on by someone else | 1
abcd | red dead | company1 | Made by billy             | 2
defg | halo 3   | company2 | Made by bob               | 1
defg | halo 3   | company2 | worked on by someone else | 1
hijk | fortnite | company3 | Made by lilly             | 1

因为 user_id rn2n 有多个实例都具有相同的标识符,所以输出应该只返回最旧的日期时间实例(即 07:30:00.00 实例。)当前输出计算每个字符串的不同 user_id,这就是为什么 rn2n 计算一次为 made由鲍勃和一次由其他人制作。

预期的输出应该是这样的:

abcd | red dead | company1 | worked on by someone else | 1
abcd | red dead | company1 | Made by billy             | 2
defg | halo 3   | company2 | worked on by someone else | 1
hijk | fortnite | company3 | Made by lilly             | 1

【问题讨论】:

不清楚为什么defg | halo 3 | company2 | Made by bob | 1这一行应该被删除——请解释一下使用这一行的逻辑 由于 user_id rn2n 有 3 个 defg 标识符实例,因此只有 table2 中最旧的日期时间(即 07:30:00)行应计入输出。输出中的 abcd 标识符可以有多行,因为它来自不同的唯一 user_id。 知道了。有道理。很快就会回答 【参考方案1】:

以下是 BigQuery 标准 SQL

#standardSQL
SELECT F.Identifier, F.Videogame, F.Developer,
CASE WHEN S.String='1581' THEN 'Made by billy'
     WHEN S.String='1903' THEN 'Made by bob'
     WHEN S.String='5849' THEN 'Made by lilly'
     ELSE 'worked on by someone else' END AS Final_Name,
     COUNT(DISTINCT S.User_ID) AS COUNT
FROM `project.dataset.table1` AS F
JOIN (
  SELECT AS VALUE ARRAY_AGG(t ORDER BY datetime LIMIT 1)[OFFSET(0)]
  FROM `project.dataset.table2` t
  GROUP BY User_ID

) AS S
ON F.Identifier=S.Identifier
GROUP BY F.Identifier, F.Videogame, F.Developer, Final_Name 

如果适用于您问题的样本数据 - 结果将是

Row Identifier  Videogame   Developer   Final_Name                  Count    
1   abcd        red dead    company1    worked on by someone else   1    
2   abcd        red dead    company1    Made by billy               2    
3   defg        halo 3      company2    worked on by someone else   1    
4   hijk        fortnite    company3    Made by lilly               1    

【讨论】:

以上是关于SQL Count Distinct Value Oldest DateTime的主要内容,如果未能解决你的问题,请参考以下文章

sql sql__count_distinct.sql

SQL COUNT DISTINCT 函数

markdown sql,count,distinct

SELECT Count Distinct Syntax MS Access SQL [重复]

优化 COUNT(DISTINCT) SQL 查询

count(distinct) over (partition by... 在 Oracle SQL 中不起作用