有没有一种方法可以计算特定列中第一次看到多少个字符串?

时间:2020-09-11 06:55:28

标签: sql

**是否有一种方法可以计算在特定列中看到了多少个字符串

由于第2列中的值有时由于某些客户在不同时间进行几次交易(客户可以在第一个月进行交易,然后在第二年晚些时候进行交易)而重复出现。 我有什么办法可以计算一个分组中每个月每个月有多少个全新的ID(以前从未见过)?

如果您需要更多背景信息,请告诉我。 谢谢!

3 个答案:

答案 0 :(得分:0)

首先,您应将每个ID与年和月相关联,这是全新的,然后进行计数,然后按年和月分组:

SELECT count(*) as new_customers, extract(year from t1.date) as year, 
extract(month from t1.date) as month FROM table t1 
WHERE not exists (SELECT 1 FROM table t2 WHERE t1.id==t2.id AND t2.date<t1.date) 
GROUP BY year, month;

您的结果将包含新客户数,年份和月份

答案 1 :(得分:0)

您可以执行以下操作,为该特定customer_id唯一的每个交易分配一个等级(因此,排名1表示这是该customer_id的第一笔订单)

上面的内容包含在内嵌视图中,然后查询内嵌视图,仅在排名为1的情况下为您提供月份和该月的客户ID计数。

我已经在Oracle上测试过,并且可以正常工作。

SELECT DISTINCT
    EXTRACT(MONTH FROM date_of_transaction) AS month,
    COUNT(customer_id)
FROM
    (
        SELECT
            date_of_transaction,
            customer_id,
            RANK() OVER(PARTITION BY customer_id
                ORDER BY
                    date_of_transaction ASC
            ) AS rank
        FROM
            table_1
    )
WHERE
    rank = 1
GROUP BY
    EXTRACT(MONTH FROM date_of_transaction)
ORDER BY 
    EXTRACT(MONTH FROM date_of_transaction) ASC;

答案 2 :(得分:0)

一种简单的方法是两个级别的聚合。内部级别为每个客户获取第一个日期。外部按年份和月份进行汇总:

select year(min_date), month(min_date), count(*) as num_firsts
from (select customerid, min(date) as min_date
      from t
      group by customerid
     ) c
group by year(min_date), month(min_date)
order by year(min_date), month(min_date);

请注意,日期/时间功能取决于您所使用的数据库,因此从日期中获取年/月的语法在您的数据库中可能会有所不同。