【问题标题】: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)

【问题讨论】:

    标签: sql advantage-database-server


    【解决方案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 的计数与整个数据库进行比较,而不是时间范围。
    猜你喜欢
    • 1970-01-01
    • 2015-04-22
    • 2022-11-22
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2018-11-29
    • 2018-01-17
    • 2021-06-26
    相关资源
    最近更新 更多