计算不同值的出现而不分组?

Posted

技术标签:

【中文标题】计算不同值的出现而不分组?【英文标题】:Count occurence of distinct value without grouping? 【发布时间】:2020-04-28 14:28:05 【问题描述】:

我需要逐行提取而不对所有 clientID 进行分组,见下文。

我正在编写一个快速摘要,以了解我们的客户预订产品的次数,以便我们了解他们的第二次、第三次或第四次预订。

select c.clientid, c.bookref, left(c.tourno, 6) as tourref, c.book_date
from cust c

where c.book_date between '2018-01-01' and ' 2020-01-01'

order by clientid asc, book_date asc

这是非常基本的 SQL,每次预订都会生成一行结果。我需要做的是计算ClientID出现的次数,并通过“clientid asc,book_date asc”对表格进行排序,我应该能够得出一长串预订以及每行对应的预订号.

不幸的是,我看到的所有帮助示例基本上都将 ID 列分组,所以我可以看到 ID“255253”的计数为 7(因此有 7 个预订),但不知道这些预订是什么。

谢谢!顺便说一句,我正在使用 Advantage SQL。

我认为最好的解释方法是,假设您在 Excel 的 A 列中有一个按日期顺序排列的 clientID 升序列表,然后将此公式应用于单元格 B2:

=IF(A2=A1,B1+1,1)

【问题讨论】:

【参考方案1】:

你可以使用窗口函数:

select c.clientid, c.bookref, left(c.tourno, 6) as tourref, c.book_date,
       count(*) over (partition by c.clientid) as client_cnt
from cust c
where c.book_date between '2018-01-01' and '2020-01-01'
order by clientid asc, book_date asc;

AdvantageSQL 可能不支持这些。您也许可以将您想要的东西连接在一起:

select c.clientid, count(*) as client_cnt,
       group_concat(c.bookref order by book_date)
from cust c
where c.book_date between '2018-01-01' and '2020-01-01'
group by clientid asc;

【讨论】:

嗨 Gordon,你说得对,我认为 Advantage 不支持 Window 函数,我收到一条错误消息,指出:poQuery: Error 7200: AQE Error: State = 42000;本机错误 = 2115; [iAnywhere 解决方案][Adv​​antage SQL 引擎]未找到预期的词法元素:FROM 您在 SELECT 语句中的列定义之后缺少关键字 FROM。 -- SQL语句中的错误位置是:95(行:2列:22)【参考方案2】:
select c.clientid, c.bookref, left(c.tourno, 6) as tourref, c.book_date, c2.number_of_bookings 
        from cust c
        inner join (select clientid, count(*) AS number_of_bookings from cust
where book_date between '2018-01-01' and '2020-01-01'        
group by clientid) c2
        on c.clientid = c2.clientid 
        order by c.clientid asc, c.book_date asc

我会将同一张表加入到自身中。

【讨论】:

嗨彼得,谢谢你,它工作得很好。还有一件事,所以这正确地显示了出现的数量,但它没有显示一个上升的数字来显示每组 clientID 的预订。这么说吧,假设我们有 ClientID 6 和 Client 7,6 有两个预订,7 有三个。我想在每个客户的行旁边看到一个 1 和 2,所以他们的第一个预订是“1”,他们的第二个是“2” - 同样对于客户 7,他们各自都有一个 1、2 和 3线。希望这是有道理的。 实际上,抱歉,将其与提取的计数进行比较会产生 95% 的准确度。不幸的是,我认为您的加入是将 clientID 的计数与整个数据库进行比较,而不是时间范围。

以上是关于计算不同值的出现而不分组?的主要内容,如果未能解决你的问题,请参考以下文章

计算火花数据框中所有列(300 列)的每个不同值的出现次数

如何计算Javascript中对象数组中不同值的出现次数?

R语言使用cph函数和rcs函数构建限制性立方样条cox回归模型使用rms包的Predict函数计算指定连续变量在不同分组变量下和风险比HR值的关系使用ggplot2可视化变量与风险值HR的关系

当通过R中的不同变量进行分组和汇总时,计算分类变量的出现次数

在 XSLT 中,如何计算给定属性值的每个不同值出现在输入 XML 中的次数?

对具有空值和不同值的行进行分组