Sql 有没有办法计算第一次在特定列中看到多少字符串?

Sql 有没有办法计算第一次在特定列中看到多少字符串?,sql,Sql,**有没有一种方法可以计算在一个特定列中看到多少字符串 由于某些客户在不同时间进行多次交易,第2列中的值有时会重复,因此客户可以在第一个月进行交易,然后在下一年晚些时候进行交易。 有没有办法让我通过一个从未见过的小组来计算每月有多少ID是全新的 请让我知道,如果你需要更多的背景。 谢谢 首先,您应该将每个ID与全新的年份和月份关联起来,然后进行计数,同时按年份和月份进行分组: SELECT count(*) as new_customers, extract(year from t1.date)

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

由于某些客户在不同时间进行多次交易,第2列中的值有时会重复,因此客户可以在第一个月进行交易,然后在下一年晚些时候进行交易。 有没有办法让我通过一个从未见过的小组来计算每月有多少ID是全新的

请让我知道,如果你需要更多的背景。
谢谢

首先,您应该将每个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;
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);

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

首先,您应该生成将每个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;
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);

您的结果将包含新客户数量、年和月

您可以执行以下操作,为每个交易分配一个等级,该等级对于特定客户id是唯一的。等级1表示该客户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;

您可以执行以下操作,这将为每个交易分配一个等级,这些交易对于该特定客户id是唯一的。因此,等级1将意味着它是该客户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;

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

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;
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);

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

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

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;
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);

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

非常感谢!如果我希望收到按日期分组的按月份列中有多少是完全新的结果,该怎么办?这会改变结构,对吗?@mcksoulnuke如果在这个时期之前没有记录,那么它们是全新的,不是吗?的确!你能看看这篇文章的新编辑部分吗?非常感谢你!我重视你的努力@McSoulnuke我无法完全理解你想要什么,你想在一个月内每天统计全新的客户吗?在整个专栏历史中,全新的客户,在他们进来时按月份分组。非常感谢!如果我希望收到按日期分组的按月份列中有多少是完全新的结果,该怎么办?这会改变结构,对吗?@mcksoulnuke如果在这个时期之前没有记录,那么它们是全新的,不是吗?的确!你能看看这篇文章的新编辑部分吗?非常感谢你!我重视你的努力@McSoulnuke我无法完全理解您想要什么,您想在一个月内每天统计完全新的客户吗?在整个专栏历史中,完全新的客户,按月份分组。您使用的是哪种DBMS产品?SQL只是一种查询语言,而不是特定数据库产品的名称,并且日期/时间函数非常特定于供应商。请为您正在使用的数据库产品添加。您使用的是哪种DBMS产品?SQL只是一种查询语言,而不是特定数据库产品的名称,并且日期/时间函数非常特定于供应商。请为您正在使用的数据库产品添加。非常感谢。杰出的得到了正确的结果谢谢!杰出的得到了正确的结果谢谢!杰出的得到了正确的结果谢谢!杰出的得到了正确的结果