如何使用 SQL 选择每个唯一日期的唯一会话?

Posted

技术标签:

【中文标题】如何使用 SQL 选择每个唯一日期的唯一会话?【英文标题】:How to select unique sessions per unique dates with SQL? 【发布时间】:2020-05-23 08:13:07 【问题描述】:

我正在努力处理我的 SQL。我想从表中选择唯一日期的所有唯一会话。我没有得到我想要的结果。

表格示例:

session_id | date
87654321   | 2020-05-22 09:10:10
12345678   | 2020-05-23 10:19:50
12345678   | 2020-05-23 10:20:23
87654321   | 2020-05-23 12:00:10

这是我现在的 SQL。我从日期时间列中选择所有不同的日期。我还计算了所有不同的 session_id。我按日期对它们进行分组。

SELECT DISTINCT DATE_FORMAT(`date`, '%d-%m-%Y') as 'date', COUNT(DISTINCT `session_id`) as 'count' FROM `logging` GROUP BY 'date'

我想看到的是(上面的例子):

date       | count
22-05-2020 | 1
23-05-2020 | 2

我现在用我的真实表(在 3 个不同日期有 354 个会话)得到的结果是:

date       | count
21-05-2020 | 200

编辑

将 ` 更改为 '。

【问题讨论】:

您使用的是哪个 SQL 引擎?请提供样本数据和预期结果。 只需从此处删除 DISTINCT:COUNT(DISTINCT session_id),您将获得每个日期的所有会话数。如果您想要唯一的会话,那么您的查询就可以了。 从 COUNT(DISTINCT session_id) 中删除 DISTINCT 得到相同的结果 【参考方案1】:

字段名称和别名名称相同(date)。请尝试为别名使用不同的名称以避免在 GROUP BY 部分中混淆

【讨论】:

与别名日期混淆是问题所在。谢谢!【参考方案2】:

您可能希望根据日期表达式进行分组

SELECT DATE_FORMAT(`date`, '%d-%m-%Y') as `date`, COUNT(DISTINCT `session_id`) as `count` FROM `logging` GROUP BY DATE_FORMAT(`date`, '%d-%m-%Y')

【讨论】:

以上是关于如何使用 SQL 选择每个唯一日期的唯一会话?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Oracle SQL 中不使用 distinct 选择从多个 max(case when) 派生的唯一行

如何在 SQL 中计算每个用户的唯一日期的平均收入

为每个唯一 ID 选择最近 30 个日期

SQL:如何选择每个唯一标识符的值最低的记录

SQL - 帮助根据比例和唯一 ID 选择随机日期

如何选择和计算每个唯一行的最常见的第一个值?