Sql 有没有办法计算第一次在特定列中看到多少字符串?
**有没有一种方法可以计算在一个特定列中看到多少字符串 由于某些客户在不同时间进行多次交易,第2列中的值有时会重复,因此客户可以在第一个月进行交易,然后在下一年晚些时候进行交易。 有没有办法让我通过一个从未见过的小组来计算每月有多少ID是全新的 请让我知道,如果你需要更多的背景。Sql 有没有办法计算第一次在特定列中看到多少字符串?,sql,Sql,**有没有一种方法可以计算在一个特定列中看到多少字符串 由于某些客户在不同时间进行多次交易,第2列中的值有时会重复,因此客户可以在第一个月进行交易,然后在下一年晚些时候进行交易。 有没有办法让我通过一个从未见过的小组来计算每月有多少ID是全新的 请让我知道,如果你需要更多的背景。 谢谢 首先,您应该将每个ID与全新的年份和月份关联起来,然后进行计数,同时按年份和月份进行分组: SELECT count(*) as new_customers, extract(year from t1.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与完全新的年和月关联,然后计数,同时按年和月分组:
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只是一种查询语言,而不是特定数据库产品的名称,并且日期/时间函数非常特定于供应商。请为您正在使用的数据库产品添加。非常感谢。杰出的得到了正确的结果谢谢!杰出的得到了正确的结果谢谢!杰出的得到了正确的结果谢谢!杰出的得到了正确的结果