Hey Ankit , your channel is really addictive. Since yesterday I have picked more than 15 problems in a row (which indirectly means I watched 15 videos from your channel straight in a row). I am really enjoying it. People binge watch Netflix and here I am binge watching sql problem solving. Can't express in words, felt like I found the gem on the RUclips. It pumped adrenaline rush in my body when I am able to solve the problems without looking at the solution. At the end comparing my solution with your provided solution and that also is teaching me how to solve any problem in minimal joins and subqueries. Amazing....Amazing...Amazing....Thank you so much for all your hardwork and knowledge sharing.
For me also same thing,I am not forcefully learning, by intrest I am coming and watching your videos....I can say I addicted to your channel. The positive of your channel is you will provide table with data so it make us to practice while watching your video
Exactly the same here too. I'm not able to sleep at night till i solve problems and i never see your solution till i solve it myself. Thanks for this good collection of questions
Exactly..Same here addicted to the explaination and over enthusiastic to solve. Initially to type single line query I was seeing and typing ,now I am watching whole video till end and then writing 5-6lines queries without seeing. @AnkitBansalYou got great teaching skills.
Hi Ankit, this is my approach-- 1. First of all, I will maintain a ranking for each customer for each day. select customerid, orderdate, rank() over(partition by customerid order by orderdate asc) rnk 2. Once I get the rank for each customer, I will take those customers as new against whom rank = 1 and rest as repeat customers. select orderdate, count(customerid) total_cust, count(case when rnk=1 then customerid else null end) new_cust, count(customerid) - count(case when rnk=1 then customerid else null end) repeat_cust from (select customerid, orderdate, rank() over(partition by customerid order by orderdate asc) rnk ) a order by orderdate asc
I was asked exactly the same question in my interview with dunnhumby and I failed to answer as I panicked and tried to give an answer hurriedly . Now after going through your video in steps , I completely understood the approach in how to deal with these questions. Looking forward to the rest of the playlist .
Select a.order_date, Sum(Case when a.order_date = a.first_order_date then 1 else 0 end) as new_customer, Sum(Case when a.order_date != a.first_order_date then 1 else 0 end) as repeat_customer from( Select customer_id, order_date, min(order_date) over(partition by customer_id) as first_order_date from customer_orders) a group by a.order_date;
Hi Sir, Thank you for all your videos ..Really helpful for learning . Here is my query with cte as (select customer_id,min(order_date) as first_visit_date from customer_orders group by customer_id)
select c.order_date, sum(case when c.order_date = f.first_visit_date then 1 else 0 end) as first_visit_flag, sum(case when c.order_date != f.first_visit_date then 1 else 0 end) as repeat_visit_flag, sum(case when c.order_date = f.first_visit_date then order_amount else 0 end) as newCustAmount, sum(case when c.order_date != f.first_visit_date then order_amount else 0 end) as repeatCustAmount
from customer_orders c inner join cte f on c.customer_id=f.customer_id group by c.order_date ;
Assignment query: with cte as( select order_date,order_amount, row_number() over(partition by customer_id order by order_date asc) as rn from customer_orders) select order_date, sum(case when rn=1 then 1 else 0 end) as new_customers, sum(case when rn>1 then 1 else 0 end) as repeat_customers, sum(case when rn=1 then order_amount else 0 end) as new_customers_order_amount, sum(case when rn>1 then order_amount else 0 end) as repeat_customers_order_amount from cte group by order_date; select * from customer_orders;
Hello Ankit, A big thank you for this superb SQL playlist. I've started my SQL interview prep with this playlist. I have come up with my own solution for this problem, this will also handle edge case where same customer has ordered multiple times in a day - SELECT a.order_date, SUM(CASE WHEN a.cust_order_row = 1 THEN 1 ELSE 0 END) AS new_customers, SUM(CASE WHEN a.cust_order_row 1 THEN 1 ELSE 0 END) AS repeat_customers FROM (SELECT order_date, ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY order_date) AS cust_order_row FROM customer_orders) a GROUP BY a.order_date;
select order_date, sum(case when first_purchase = order_date then 1 else 0 end) as new_customer_count, sum(case when first_purchase != order_date then 1 else 0 end) as repeat_customer_count, sum(order_amount) as total_amount from (select * from (select customer_id, min(order_date) as first_purchase from customer_orders1 group by customer_id)a join (select * from customer_orders1)b on a.customer_id = b.customer_id)ab group by ab.order_date order by ab.order_date; Thank you, Ankit, learning a lot from your channel :)
Good one as always! Here's my approach: ================================== with cust_count as (select *, COUNT(customer_id) over(partition by customer_id order by order_date) [flag] from customer_orders) select order_date, COUNT(case when [flag] = 1 then 1 end) [New customers], COUNT(case when [flag] > 1 then 1 end) [Repeat customers] from cust_count group by order_date ==================================
Hi Ankit, 2 years I cracked the DA role with your help, now when I'm preparing again for a switch, this is my go to source material for SQL Prep, thanks for a splendid playlist. Here is my solution: SELECT order_date, sum(CASE WHEN rn2 = 1 THEN 1 ELSE 0 END) AS new, sum(CASE WHEN rn2 > 1 THEN 1 ELSE 0 END) AS repeat FROM (SELECT *, row_number() over(PARTITION BY customer_id ORDER BY order_date ASC, customer_id ASC) AS rn2 FROM customer_orders) GROUP BY order_date ORDER BY order_date;
I was asked the same question in curefit in 3rd round. There were 2 extra tables to refer but now I realize it could have been done using single table with min order date criteria. Glad I stumbled on your channel
Thanks, ankit for this brainstorming question, initially couldnt figure out the but the min(order_date) that you gave was the key. I accomplished this with subqueries: select order_date,count(new_customer) as new,count(repeat_customer) as repeat from ( select order_date, case when order_date=first_order_date then 'new_customer' end as new_customer, case when order_date!=first_order_date then 'repeat_customer' end as repeat_customer from ( select a.*,b.first_order_date from customer_orders a join( select customer_id,min(order_date) as first_order_date from customer_orders group by customer_id) b on a.customer_id=b.customer_id)c)d group by order_date order by order_date asc;
Hey Ankit, Thank you for this problem questions. I specially like the assignment you give at the end. As I am a beginner for SQL its very my encouraging and confidence boosting for me. Assignment sol:- with first_visit_flag as (SELECT customer_id, MIN(order_date) as first_visit_date FROM customer_orders GROUP BY customer_id), repeat_visit_flag AS ( SELECT co.order_date, fv.first_visit_date, CASE WHEN co.order_date=fv.first_visit_date THEN 1 ELSE 0 END AS first_visit, CASE WHEN co.order_date!=fv.first_visit_date THEN 1 ELSE 0 END AS repeat_visit, CASE WHEN co.order_date=fv.first_visit_date THEN SUM(order_amount) ELSE 0 END AS new_order, CASE WHEN co.order_date!=fv.first_visit_date THEN SUM(order_amount) ELSE 0 END AS repeat_order FROM customer_orders co inner join first_visit_flag fv ON co.customer_id = fv.customer_id GROUP BY co.order_date,fv.first_visit_date ) SELECT order_date, SUM(first_visit) as new_customer,SUM(repeat_visit) as repeat_customer, SUM(new_order) AS new_order_amount, SUM(repeat_order) AS repeat_order_amount FROM repeat_visit_flag GROUP BY order_date;
Thanks, Ankit for this brainstorming question, MY QUERY SELECT order_date, Count(CASE WHEN rnk = 1 THEN cnt END) AS "New Customer", Count(CASE WHEN rnk > 1 THEN cnt END) AS "Old Customer" FROM ( SELECT order_date, customer_id, DENSE_RANK() OVER (PARTITION BY customer_id ORDER BY order_date) AS rnk, COUNT(*) OVER (PARTITION BY customer_id, order_date) AS cnt FROM customer_orders1 ) A GROUP BY order_date;
Thanks Ankit, Here is my approach: with A1 as ( select customer_id, min(order_date) as min_order_date from customer_orders group by customer_id ) , B1 as ( select * from customer_orders ) , C1 as ( select B1.* , A1.min_order_date from A1 inner join B1 on A1.customer_id=B1.customer_id ) select order_date, sum(case when order_date=min_order_date then 1 else 0 end) as new_customer_count, sum(case when order_datemin_order_date then 1 else 0 end) as old_customer_count from C1 group by order_date;
MYSQL Query for the same:- with cte as( select order_date, row_number() over(partition by customer_id order by order_date asc) as rn from customer_orders) select order_date, sum(case when rn=1 then 1 else 0 end) as new_customers, sum(case when rn>1 then 1 else 0 end) as repeat_customers from cte group by order_date;
I ended up being very close to your solution with a little difference. with old_new_counter as ( SELECT *,row_number() over (partition by customer_id order by order_date) old_new_flag FROM customer_orders) select order_date, count(case when old_new_flag=1 then 'new_customer' end) count_new_customer, count(case when old_new_flag>1 then 'old_customer' end) count_repeat_customer from old_new_counter group by order_date order by order_date; Cheers
This query will not give expected output in a case where same user has more than 1 order the same date. I tested using same records 2 times in a table . Just my input..
Hi Ankit Thanks your videos are helping me to break down complex scnearios into smaller parts and then combine the whole query.....so i did the query in different way..Please do let me know if thats correct since the motive is only to find duplicate and new customers with cte as ( select customer_id,count(1) as ranking from customer_orders group by customer_id) select * , case when ranking>1 then 'Duplicate' else 'New' end as status_customer from cte; customer_id ranking status_customer 100 3 Duplicate 200 1 New 300 1 New 400 2 Duplicate 500 1 New 600 1 New
sELECT order_date, Sum(cASE WHEN ORDER_DATE = fIRST_dATE THEN 1 else 0 END) AS nEW, Sum(cASE WHEN ORDER_DATE fIRST_dATE THEN 1 else 0 END )AS rEPEATCUS FROM (Select Customer_id,order_date, Min(order_date) over (Partition by customer_id order by order_date) as First_Date from customer_orders ) as a group by order_date got the answer by this too thanks
My solution: with first_order as ( select order_date, customer_id, min(order_date) over(partition by customer_id) as first_order_date from customer_orders ) select order_date, sum(case when order_date = first_order_date then 1 else 0 end) as new_customer_count, sum(case when order_date first_order_date then 1 else 0 end) as repeat_customer_count from first_order group by 1 order by 1;
Hey Ankit Thanks for providing this question my solution for this problem with cte as (select order_id , customer_id , order_date , lag(customer_id)over(partition by customer_id order by order_date) as statements from customer_orders) select order_date , sum(case when statements is null then 1 else 0 end) as new_customer_count , sum(case when statements is not null then 1 else 0 end) as old_customer_count from cte group by order_date order by order_date
Hi Ankit, with cte as (select *, row_number() over (partition by customer_id order by order_date) as order_flag from customer_orders) select order_date, sum(case when order_flag=1 then 1 else 0 end) as new_customer_count, sum(case when order_flag>1 then 1 else 0 end) as repeat_customer_count from cte group by order_date
Very good question. WITH cte AS ( SELECT order_id, customer_id, order_date, order_amount, RANK() OVER(PARTITION BY customer_id ORDER BY order_date) AS rnk FROM customer_orders ) SELECT order_date, SUM(CASE WHEN rnk =1 THEN 1 ELSE 0 END) AS new_customer_count, SUM(CASE WHEN rnk 1 THEN 1 ELSE 0 END) AS repeat_customer_count FROM cte GROUP BY order_date;
with cte1 as (select order_date, case when customer_id= rep_cs then 1 else 0 end as rep_flag, case when customer_id rep_cs then 1 else 0 end as new_flag from (select order_date,customer_id,lag(customer_id,3,0) over(order by order_id )as rep_cs from customer_orders) e1) select order_date,sum(new_flag) as new_customer, sum(rep_flag) as rep_customer from cte1 group by order_date
Thanks Ankit for great explanatory video> Here is solution of assignment given in video WITH first_visit AS ( SELECT customer_id, min(order_date) AS first_visit_date FROM customer_orders GROUP BY customer_id) SELECT co.order_date, SUM(CASE WHEN co.order_date = fv.first_visit_date THEN 1 ELSE 0 END) AS first_visit_customer, SUM(CASE WHEN co.order_date != fv.first_visit_date THEN 1 ELSE 0 END) AS repeat_visit_customer, SUM(CASE WHEN co.order_date = fv.first_visit_date THEN order_amount ELSE 0 END) AS first_visit_customer_order, SUM(CASE WHEN co.order_date != fv.first_visit_date THEN order_amount ELSE 0 END) AS repeat_visit_customer_order FROM customer_orders co INNER JOIN first_visit fv ON co.customer_id = fv.customer_id GROUP BY co.order_date
Here is my query With cte_1 as ( Select *, rank() over(partition by customer_id order by order_date) as ranked from customer_orders ), cte_2 as ( Select order_date, case when ranked = 1 then 'new' else 'repeat' end as new_or_repeat from cte_1 ) Select order_date, sum(case when new_or_repeat = 'new' then 1 else 0 end) as new_customer,sum(case when new_or_repeat = 'repeat' then 1 else 0 end) as repeat_customer from cte_2 group by order_date; Thank you for your efforts
with cte as ( select *, row_number () over (partition by customer_id order by order_date ) as rn from customer_orders), cte1 as (select order_date , count(1) as new_cust from cte where rn=1 group by order_date), cte2 as ( select order_date , count(1) as rep_cust from cte where rn>1 group by order_date) select a.order_date,new_cust, case when rep_cust is null then 0 else rep_cust end as rep_cust from cte1 a left join cte2 b on a.order_date=b.order_date
Thanks Ankit, Here is my solution - with cte as ( select *, count(order_id) over(partition by customer_id order by order_date rows between unbounded preceding and current row) as cnt from customer_orders ) select order_date, sum(case when cnt = 1 then 1 else 0 end) as new_cust_ind, sum(case when cnt > 1 then 1 else 0 end) as repeat_cust_ind, sum(case when cnt = 1 then order_amount else 0 end) as new_cust_amt, sum(case when cnt > 1 then order_amount else 0 end) as repeat_cust_amt from cte group by order_date;
Hi Ankit,your channel is very helpful and the way you are explaining is just amazing. Here is my solution for this,WITH CTE AS ( SELECT ORDER_ID,CUSTOMER_ID,ORDER_DATE,ORDER_AMOUNT, CASE WHEN PRIV IS NULL THEN 1 ELSE 0 END AS NEW_FLAG, CASE WHEN PRIV IS NOT NULL THEN 1 ELSE 0 END AS OLD_FLAG FROM ( select *, lag(ORDER_DATE) over(partition by CUSTOMER_ID order by ORDER_DATE) as PRIV from customer_orders) ORDER BY ORDER_ID) SELECT ORDER_DATE,SUM(NEW_FLAG) AS NEW_CUSTOMER,SUM(OLD_FLAG) AS OLD_CUTOMER FROM CTE GROUP BY ORDER_DATE;
Great content as always. Here is my attempt to the homework with first_order_table as (select customer_id, min(order_date) as first_order_date from customer_orders group by customer_id) select co.order_date, sum(case when co.order_date = fot.first_order_date then co.order_amount else 0 end) as order_amount_by_new_customer, sum(case when co.order_date fot.first_order_date then co.order_amount else 0 end) as order_amount_by_repeat_customer from customer_orders co join first_order_table fot on fot.customer_id = co.customer_id group by co.order_date order by 1
Amazing Video and Interpretation, thanks a lot for making this video, here is the answer for assignment with fv as ( select CUSTOMER_ID, min(ORDER_DATE) as fisrtVist from customer_orders group by CUSTOMER_ID), final as( select co.ORDER_DATE, SUM(case when co.ORDER_DATE = fv.fisrtVist then 1 else 0 end) as firstVistFinal, SUM(case when co.ORDER_DATE != fv.fisrtVist then 1 else 0 end) as repeatVistFinal, SUM(case when co.ORDER_DATE = fv.fisrtVist then order_amount else 0 end) as firstVistAmout, SUM(case when co.ORDER_DATE != fv.fisrtVist then order_amount else 0 end) as repeatVistAmout from customer_orders co , fv where fv.CUSTOMER_ID = co.CUSTOMER_ID group by co.ORDER_DATE ) select * from final
Hi Ankit, thanks for creating such videos. Here is my approach: with sequenced_order_table as( select *, dense_rank() over(partition by customer_id order by order_date) as order_seq from customer_orders) SELECT order_date, count(case when order_seq = 1 then customer_id end) as new_customer, count(case when order_seq > 1 then customer_id end) as old_customer FROM sequenced_order_table group by 1 order by 1
tysm for your video here's my attempt SELECT t1.order_date, sum( CASe when t1.customer_id not in (select t2.customer_id from customer_orders as t2 WHERE t2.order_date=t1.order_date - INTERVAL '1day') then 1 ELSE 0 end) as news, sum( CASe when t1.customer_id in (select t2.customer_id from customer_orders as t2 WHERE t2.order_date=t1.order_date - INTERVAL '1day') then 1 ELSE 0 end) as repeat from customer_orders as t1 GROUP by t1.order_date
Hi everyone, HW Task: add two columns of first_visit_order_amount, last_first_visit_order_amount Solution: sum(case when fv.first_visit_date = co.order_date then co.order_amount else 0 end) as first_visit_Order_amt_flag , sum(case when fv.first_visit_date != co.order_date then co.order_amount else 0 end) as repeat_visit_order_amt_flag add this two columns in Ankit's solution.
Hi Ankit..Thanks for your efforts.. I have an alternate solution as well WITH CTE AS( select *,CASE WHEN(DENSE_RANK()OVER(PARTITION BY customer_id ORDER BY order_date)=1) THEN 'New' ELSE 'Repeat' END AS IND_CUSTOMER from customer_orders ) SELECT order_date,count(CASE WHEN IND_CUSTOMER='New' THEN order_id END) AS no_new_customer, count(CASE WHEN IND_CUSTOMER='Repeat' THEN order_id END) AS no_repeat_customer FROM CTE GROUP BY order_date ORDER BY order_date
Solved the question without looking into the solution in MySQL, I have used the concept of sum with case when after seeing it in your other video, it is very helpful and important concept: with cte as ( select *, row_number() over(partition by customer_id) as rn from customer_orders order by order_date ) select order_date, sum(case when rn = 1 then 1 else 0 end) as new_customer_count, sum(case when rn = 1 then 0 else 1 end) as repeat_customer_count from cte group by order_date; Please let me know if there is some issue in this code
I was asked this same question today in amazon interview. The question was lil changed but concept was same. They needed new user counts in a year 2022 only and wanted the output to be displayed as weekly level. So for week 1 how many new users till week 52. I was able to solve this though i took some time not sure if they judge on the speed as well. Thanks for this video
Thanks Ankit for your guidance. Please have a look below query select sum(case when tc> 1 then 1 else 0 end )as repeat_customer, sum(case when tc= 1 then 1 else 0 end )as new_customer from (select customer_id, count( customer_id) as tc from customer_orders group by customer_id) a ;
Hey Ankit, I have used a different approach: with new_table as( select order_date,count(customer_id) as new_customer from customer_orders a where 0=( select count(*) from customer_orders b where a.order_date>b.order_date and a.customer_id=b.customer_id) group by order_date), repeat_table as (select order_date,count(customer_id) as old_customer from customer_orders a where ( select count(*) from customer_orders b where a.order_date>b.order_date and a.customer_id=b.customer_id)>0 group by order_date) select case when a.order_date is null then b.order_date else a.order_date end as date ,new_customer,old_customer from new_table a full outer join repeat_table b on a.order_date=b.order_date;
There is a small difference between the repeat customers (those purchased for the consecutive days) and old customers (no consecutive days condition). For the repeat customers - purchasing for consecutive days select order_date, sum(new_customer) as new_customer, sum(repeat_customer) as repeat_customer from (select customer_id, order_date, case when order_date=first_visit then 1 else 0 end as new_customer, case when date_diff(order_date, prev_day)=1 then 1 else 0 end as repeat_customer ( select customer_id, order_date, min(order_date) over (partition by customer_id) as first_visit , lag(order_date,1,0) over (partition by customer_id order by order_date) as prev_day from customer_orders)x)y group by order_date
i tried it and here is my solution: with rn1 as( select *,row_number() over(partition by customer_id order by order_date) as rn from customer_orders ) select order_date,sum(case when rn =1 then 1 else 0 end) as new_customer,sum(case when rn > 1 then 1 else 0 end) as repeat_customer from rn1 group by order_date
hi ankith this is also working with cte as ( SELECT *,min(order_date) over (partition by customer_id) as first_date FROM customer_orders as a ) select order_date,count(case when order_date first_date then customer_id end) as repeat, count(case when order_date = first_date then customer_id end) as new, count(customer_id) as total from cte group by order_date
I have implemented with this logic. with cte as ( select *,ROW_NUMBER() over(partition by customer_id order by order_date asc) as rnk from customer_orders), cte_not_1 as (select order_date,count(*) as cnt from cte where rnk 1 group by order_date) select * from ( select order_date,count(*) as new_customer_count from cte t1 where t1.rnk = 1 group by order_date) t1 left join cte_not_1 t2 on t1.order_date = t2.order_date
What if the same customer visits the website twice or thrice and orders each time? In that case, he should be a repeat customer. However, according to your solution, he won't be counted as a repeated customer as his min(order_date) = order_date. What do you think? However, your tutorials have been really helpful to me. Really appreciate your effort.
I used below query, with cte as( select *,min(order_date) over(partition by customer_id) as first_visit from customer_orders ) select order_date, sum( case when order_date=first_visit then 1 else 0 end ) as first_time, sum( case when order_datefirst_visit then 1 else 0 end ) as sec_time from cte group by order_date
SELECT order_date, SUM(CASE WHEN rn = 1 THEN 1 ELSE 0 END) first_customer, SUM(CASE WHEN rn > 1 THEN 1 ELSE 0 END) repeated_customer FROM ( SELECT customer_id, order_date, ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY order_date) AS rn FROM customer_orders ) t GROUP BY order_date
select order_date, sum(case when order_date =mn then 1 else 0 end) as new_customer ,sum(case when order_date mn then 1 else 0 end) as old_customer from ( select * ,min(order_date)over(partition by customer_id) as mn from customer_orders ) group by 1 order by 1
Hey Ankit, Your videos are really awesome and informative. Can you make some content or share resources regarding learn data analysis through python required for data analyst role
Without using join *********************** with A as (select customer_id,order_date,lag(order_date) over (partition by customer_id) as previous_visit from customer_orders) select order_date, sum(case when previous_visit is null then 1 else 0 end) as new_customer, count(*)-sum(case when previous_visit is null then 1 else 0 end) as repeat_customer from A group by order_date order by order_date
@ankit bansal can we also write this query in this way Ankit? Same output select order_date, count(case when rn = 1 then 'new' end) newcust, count(case when rn != 1 then 'repeated' end) repcust from (select customer_id, order_date, row_number() over(partition by customer_id order by order_date asc ) 'rn' from newrepeat) newt group by order_date order by order_date asc
Hey Ankit , your channel is really addictive. Since yesterday I have picked more than 15 problems in a row (which indirectly means I watched 15 videos from your channel straight in a row). I am really enjoying it. People binge watch Netflix and here I am binge watching sql problem solving. Can't express in words, felt like I found the gem on the RUclips. It pumped adrenaline rush in my body when I am able to solve the problems without looking at the solution. At the end comparing my solution with your provided solution and that also is teaching me how to solve any problem in minimal joins and subqueries. Amazing....Amazing...Amazing....Thank you so much for all your hardwork and knowledge sharing.
Thats a big compliment for me. Keep rocking 😊
For me also same thing,I am not forcefully learning, by intrest I am coming and watching your videos....I can say I addicted to your channel. The positive of your channel is you will provide table with data so it make us to practice while watching your video
Same for me also
Exactly the same here too. I'm not able to sleep at night till i solve problems and i never see your solution till i solve it myself. Thanks for this good collection of questions
Exactly..Same here addicted to the explaination and over enthusiastic to solve. Initially to type single line query I was seeing and typing ,now I am watching whole video till end and then writing 5-6lines queries without seeing. @AnkitBansalYou got great teaching skills.
Hi Ankit, this is my approach--
1. First of all, I will maintain a ranking for each customer for each day.
select customerid, orderdate, rank() over(partition by customerid order by orderdate asc) rnk
2. Once I get the rank for each customer, I will take those customers as new against whom rank = 1 and rest as repeat customers.
select orderdate, count(customerid) total_cust, count(case when rnk=1 then customerid else null end) new_cust, count(customerid) - count(case when rnk=1 then customerid else null end) repeat_cust
from
(select customerid, orderdate, rank() over(partition by customerid order by orderdate asc) rnk ) a
order by orderdate asc
Now i will never Forget CTE... Great teaching skill
I was asked exactly the same question in my interview with dunnhumby and I failed to answer as I panicked and tried to give an answer hurriedly . Now after going through your video in steps , I completely understood the approach in how to deal with these questions. Looking forward to the rest of the playlist .
Cool
@@ankitbansal6 I was also asked this questions
For which job position ankit
@@sachinkapoor2424 DS
For how many years experience did you apply?
Select a.order_date,
Sum(Case when a.order_date = a.first_order_date then 1 else 0 end) as new_customer,
Sum(Case when a.order_date != a.first_order_date then 1 else 0 end) as repeat_customer
from(
Select customer_id, order_date, min(order_date) over(partition by customer_id) as first_order_date from customer_orders) a
group by a.order_date;
Good.
impressed
A very good solution, I feel mine is overcomplicating things
Nice one Satyam 😊
Nice one bro
Hi Sir, Thank you for all your videos ..Really helpful for learning .
Here is my query
with cte as
(select customer_id,min(order_date) as first_visit_date
from customer_orders
group by customer_id)
select c.order_date,
sum(case when c.order_date = f.first_visit_date then 1 else 0 end) as first_visit_flag,
sum(case when c.order_date != f.first_visit_date then 1 else 0 end) as repeat_visit_flag,
sum(case when c.order_date = f.first_visit_date then order_amount else 0 end) as newCustAmount,
sum(case when c.order_date != f.first_visit_date then order_amount else 0 end) as repeatCustAmount
from customer_orders c
inner join cte f
on c.customer_id=f.customer_id
group by c.order_date
;
Assignment query:
with cte as(
select order_date,order_amount, row_number() over(partition by customer_id order by
order_date asc) as rn from customer_orders)
select order_date, sum(case when rn=1 then 1 else 0 end) as new_customers,
sum(case when rn>1 then 1 else 0 end) as repeat_customers,
sum(case when rn=1 then order_amount else 0 end) as new_customers_order_amount,
sum(case when rn>1 then order_amount else 0 end) as repeat_customers_order_amount
from cte
group by order_date;
select * from customer_orders;
Hello Ankit,
A big thank you for this superb SQL playlist. I've started my SQL interview prep with this playlist.
I have come up with my own solution for this problem, this will also handle edge case where same customer has ordered multiple times in a day -
SELECT a.order_date, SUM(CASE WHEN a.cust_order_row = 1 THEN 1 ELSE 0 END) AS new_customers, SUM(CASE WHEN a.cust_order_row 1 THEN 1 ELSE 0 END) AS repeat_customers FROM
(SELECT order_date, ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY order_date) AS cust_order_row FROM customer_orders) a GROUP BY a.order_date;
seriously no one in the entire youtube explained CTE like this. Made it so simple thank you ankit bro
🙏
select order_date, sum(case when first_purchase = order_date then 1 else 0 end) as new_customer_count,
sum(case when first_purchase != order_date then 1 else 0 end) as repeat_customer_count,
sum(order_amount) as total_amount from
(select * from
(select customer_id, min(order_date) as first_purchase from customer_orders1
group by customer_id)a join (select * from customer_orders1)b
on a.customer_id = b.customer_id)ab
group by ab.order_date
order by ab.order_date; Thank you, Ankit, learning a lot from your channel :)
Good one as always!
Here's my approach:
==================================
with cust_count as (select *,
COUNT(customer_id) over(partition by customer_id order by order_date) [flag]
from customer_orders)
select order_date,
COUNT(case when [flag] = 1 then 1 end) [New customers],
COUNT(case when [flag] > 1 then 1 end) [Repeat customers]
from cust_count
group by order_date
==================================
Hi Ankit, 2 years I cracked the DA role with your help, now when I'm preparing again for a switch, this is my go to source material for SQL Prep, thanks for a splendid playlist.
Here is my solution:
SELECT order_date, sum(CASE WHEN rn2 = 1 THEN 1 ELSE 0 END) AS new, sum(CASE WHEN rn2 > 1 THEN 1 ELSE 0 END) AS repeat
FROM (SELECT *,
row_number() over(PARTITION BY customer_id ORDER BY order_date ASC, customer_id ASC) AS rn2 FROM customer_orders)
GROUP BY order_date ORDER BY order_date;
MY only SQL guru.. Thank you guruji.. love you for ever.
I was asked the same question in curefit in 3rd round. There were 2 extra tables to refer but now I realize it could have been done using single table with min order date criteria. Glad I stumbled on your channel
Glad to know 🙏
You got this for which profile.
@@m04d10y1996 Product analytics
Thanks, ankit for this brainstorming question, initially couldnt figure out the but the min(order_date) that you gave was the key. I accomplished this with subqueries:
select order_date,count(new_customer) as new,count(repeat_customer) as repeat from (
select order_date,
case when order_date=first_order_date then 'new_customer'
end as new_customer,
case when order_date!=first_order_date then 'repeat_customer'
end as repeat_customer
from (
select a.*,b.first_order_date from customer_orders a
join(
select customer_id,min(order_date) as first_order_date
from customer_orders
group by customer_id) b
on a.customer_id=b.customer_id)c)d
group by order_date
order by order_date asc;
Hey Ankit,
Thank you for this problem questions. I specially like the assignment you give at the end. As I am a beginner for SQL its very my encouraging and confidence boosting for me.
Assignment sol:-
with first_visit_flag as
(SELECT customer_id, MIN(order_date) as first_visit_date
FROM customer_orders
GROUP BY customer_id),
repeat_visit_flag AS
(
SELECT co.order_date,
fv.first_visit_date,
CASE WHEN co.order_date=fv.first_visit_date THEN 1 ELSE 0 END AS first_visit,
CASE WHEN co.order_date!=fv.first_visit_date THEN 1 ELSE 0 END AS repeat_visit,
CASE WHEN co.order_date=fv.first_visit_date THEN SUM(order_amount) ELSE 0 END AS new_order,
CASE WHEN co.order_date!=fv.first_visit_date THEN SUM(order_amount) ELSE 0 END AS repeat_order
FROM customer_orders co
inner join first_visit_flag fv ON co.customer_id = fv.customer_id
GROUP BY co.order_date,fv.first_visit_date
)
SELECT order_date, SUM(first_visit) as new_customer,SUM(repeat_visit) as repeat_customer, SUM(new_order) AS new_order_amount, SUM(repeat_order) AS repeat_order_amount
FROM repeat_visit_flag
GROUP BY order_date;
Thanks, Ankit for this brainstorming question,
MY QUERY
SELECT order_date,
Count(CASE WHEN rnk = 1 THEN cnt END) AS "New Customer",
Count(CASE WHEN rnk > 1 THEN cnt END) AS "Old Customer"
FROM (
SELECT order_date, customer_id,
DENSE_RANK() OVER (PARTITION BY customer_id ORDER BY order_date) AS rnk,
COUNT(*) OVER (PARTITION BY customer_id, order_date) AS cnt
FROM customer_orders1
) A
GROUP BY order_date;
Thanks Ankit,
Here is my approach:
with A1 as (
select customer_id, min(order_date) as min_order_date from customer_orders group by customer_id
)
, B1 as (
select * from customer_orders
)
, C1 as (
select B1.* , A1.min_order_date from A1 inner join B1 on A1.customer_id=B1.customer_id
)
select order_date,
sum(case when order_date=min_order_date then 1 else 0 end) as new_customer_count,
sum(case when order_datemin_order_date then 1 else 0 end) as old_customer_count from C1 group by order_date;
MYSQL Query for the same:-
with cte as(
select order_date, row_number() over(partition by customer_id order by
order_date asc) as rn from customer_orders)
select order_date, sum(case when rn=1 then 1 else 0 end) as new_customers,
sum(case when rn>1 then 1 else 0 end) as repeat_customers from cte
group by order_date;
This is good. Thanks for posting 👏
I ended up being very close to your solution with a little difference.
with old_new_counter as (
SELECT *,row_number() over (partition by customer_id order by order_date) old_new_flag FROM customer_orders)
select order_date,
count(case when old_new_flag=1 then 'new_customer' end) count_new_customer,
count(case when old_new_flag>1 then 'old_customer' end) count_repeat_customer
from old_new_counter group by order_date
order by order_date;
Cheers
This query will not give expected output in a case where same user has more than 1 order the same date.
I tested using same records 2 times in a table .
Just my input..
this what a real time problems...thanks and keep bring such
Sure. Thanks.
This is a clear and concise explanation
VERY Good Query
Hi Ankit
Thanks your videos are helping me to break down complex scnearios into smaller parts and then combine the whole query.....so i did the query in different way..Please do let me know if thats correct since the motive is only to find duplicate and new customers
with cte as (
select customer_id,count(1) as ranking from customer_orders group by customer_id)
select * , case when ranking>1 then 'Duplicate' else 'New' end as status_customer from cte;
customer_id ranking status_customer
100 3 Duplicate
200 1 New
300 1 New
400 2 Duplicate
500 1 New
600 1 New
sELECT order_date,
Sum(cASE WHEN ORDER_DATE = fIRST_dATE THEN 1 else 0 END) AS nEW,
Sum(cASE WHEN ORDER_DATE fIRST_dATE THEN 1 else 0 END )AS rEPEATCUS
FROM
(Select Customer_id,order_date,
Min(order_date) over (Partition by customer_id order by order_date) as First_Date
from customer_orders ) as a
group by order_date got the answer by this too thanks
My solution:
with first_order as
(
select
order_date,
customer_id,
min(order_date) over(partition by customer_id) as first_order_date
from customer_orders
)
select
order_date,
sum(case when order_date = first_order_date then 1 else 0 end) as new_customer_count,
sum(case when order_date first_order_date then 1 else 0 end) as repeat_customer_count
from first_order
group by 1
order by 1;
Thank you very much Sir, for this practical question and your step by step explanation.
You are most welcome
Hey Ankit Thanks for providing this question my solution for this problem
with cte as (select order_id , customer_id , order_date ,
lag(customer_id)over(partition by customer_id order by order_date) as statements
from customer_orders)
select order_date , sum(case when statements is null then 1 else 0 end) as new_customer_count
, sum(case when statements is not null then 1 else 0 end) as old_customer_count
from cte
group by order_date order by order_date
Thanks Ankit you providing this kind of promblem solving videos , it very helpful 😄
best step by step practice
Hi Ankit,
with cte as
(select *, row_number() over (partition by customer_id order by order_date) as order_flag
from customer_orders)
select order_date,
sum(case when order_flag=1 then 1 else 0 end) as new_customer_count,
sum(case when order_flag>1 then 1 else 0 end) as repeat_customer_count
from cte
group by order_date
What a Explanation mind blowing ❤️❤️❤️
Thank you so much 😀
Very good question.
WITH cte AS
(
SELECT order_id, customer_id, order_date, order_amount, RANK() OVER(PARTITION BY customer_id ORDER BY order_date) AS rnk
FROM customer_orders
)
SELECT order_date,
SUM(CASE WHEN rnk =1 THEN 1 ELSE 0 END) AS new_customer_count,
SUM(CASE WHEN rnk 1 THEN 1 ELSE 0 END) AS repeat_customer_count
FROM cte
GROUP BY order_date;
with cte1 as
(select order_date, case when customer_id= rep_cs then 1 else 0 end as rep_flag,
case when customer_id rep_cs then 1 else 0 end as new_flag from
(select order_date,customer_id,lag(customer_id,3,0) over(order by order_id )as rep_cs
from customer_orders) e1)
select order_date,sum(new_flag) as new_customer, sum(rep_flag) as rep_customer
from cte1
group by order_date
using lag function with cte
Thanks Ankit for great explanatory video>
Here is solution of assignment given in video
WITH first_visit AS (
SELECT customer_id, min(order_date) AS first_visit_date
FROM customer_orders
GROUP BY customer_id)
SELECT co.order_date,
SUM(CASE WHEN co.order_date = fv.first_visit_date THEN 1 ELSE 0 END) AS first_visit_customer,
SUM(CASE WHEN co.order_date != fv.first_visit_date THEN 1 ELSE 0 END) AS repeat_visit_customer,
SUM(CASE WHEN co.order_date = fv.first_visit_date THEN order_amount ELSE 0 END) AS first_visit_customer_order,
SUM(CASE WHEN co.order_date != fv.first_visit_date THEN order_amount ELSE 0 END) AS repeat_visit_customer_order
FROM customer_orders co
INNER JOIN first_visit fv ON co.customer_id = fv.customer_id
GROUP BY co.order_date
A big thank you sir,, Nice explanation ❤
Here is my query
With cte_1 as (
Select *, rank() over(partition by customer_id order by order_date) as ranked from customer_orders
),
cte_2 as (
Select order_date, case when ranked = 1 then 'new' else 'repeat' end as new_or_repeat from cte_1
)
Select order_date, sum(case when new_or_repeat = 'new' then 1 else 0 end) as new_customer,sum(case when new_or_repeat = 'repeat' then 1 else 0 end) as repeat_customer from cte_2
group by order_date;
Thank you for your efforts
with cte as (
select *,
row_number () over (partition by customer_id order by order_date ) as rn
from customer_orders),
cte1 as
(select order_date , count(1) as new_cust from cte
where rn=1 group by order_date),
cte2 as (
select order_date , count(1) as rep_cust from cte
where rn>1 group by order_date)
select a.order_date,new_cust, case when rep_cust is null then 0 else rep_cust end as rep_cust from cte1 a left join cte2 b on a.order_date=b.order_date
Thanks Ankit, Here is my solution -
with cte as (
select *,
count(order_id) over(partition by customer_id
order by order_date
rows between unbounded preceding and current row) as cnt
from customer_orders
)
select order_date,
sum(case when cnt = 1 then 1 else 0 end) as new_cust_ind,
sum(case when cnt > 1 then 1 else 0 end) as repeat_cust_ind,
sum(case when cnt = 1 then order_amount else 0 end) as new_cust_amt,
sum(case when cnt > 1 then order_amount else 0 end) as repeat_cust_amt
from cte
group by order_date;
Really good channel and informative videos.
Glad you like them!
Wow Ankit, your videos on SQL are so good, informative and helpful. Thanks a lot for making them. Keep going.
Thank you 😊
Nice totala
Hi Ankit,your channel is very helpful and the way you are explaining is just amazing. Here is my solution for this,WITH CTE AS (
SELECT ORDER_ID,CUSTOMER_ID,ORDER_DATE,ORDER_AMOUNT,
CASE WHEN PRIV IS NULL THEN 1 ELSE 0 END AS NEW_FLAG,
CASE WHEN PRIV IS NOT NULL THEN 1 ELSE 0 END AS OLD_FLAG FROM (
select *,
lag(ORDER_DATE) over(partition by CUSTOMER_ID order by ORDER_DATE) as PRIV from customer_orders) ORDER BY ORDER_ID)
SELECT ORDER_DATE,SUM(NEW_FLAG) AS NEW_CUSTOMER,SUM(OLD_FLAG) AS OLD_CUTOMER FROM CTE
GROUP BY ORDER_DATE;
Great content as always.
Here is my attempt to the homework
with first_order_table as
(select customer_id, min(order_date) as first_order_date
from customer_orders
group by customer_id)
select co.order_date,
sum(case when co.order_date = fot.first_order_date then co.order_amount else 0 end) as order_amount_by_new_customer,
sum(case when co.order_date fot.first_order_date then co.order_amount else 0 end) as order_amount_by_repeat_customer
from customer_orders co
join first_order_table fot on fot.customer_id = co.customer_id
group by co.order_date
order by 1
Great explanation for both approach and solution
Glad you liked it
awesome explanation ...
Thank you for this video! Please come with problems like this. Thank you
Sure.
Best tutor
Nice
Thanks 🙏
Nice work Ankit, your way of solving the problem is simple but effective.
Amazing Video and Interpretation, thanks a lot for making this video, here is the answer for assignment
with fv as (
select CUSTOMER_ID, min(ORDER_DATE) as fisrtVist from customer_orders group by CUSTOMER_ID),
final as(
select co.ORDER_DATE,
SUM(case when co.ORDER_DATE = fv.fisrtVist then 1 else 0 end) as firstVistFinal,
SUM(case when co.ORDER_DATE != fv.fisrtVist then 1 else 0 end) as repeatVistFinal,
SUM(case when co.ORDER_DATE = fv.fisrtVist then order_amount else 0 end) as firstVistAmout,
SUM(case when co.ORDER_DATE != fv.fisrtVist then order_amount else 0 end) as repeatVistAmout
from customer_orders co , fv where
fv.CUSTOMER_ID = co.CUSTOMER_ID
group by co.ORDER_DATE
)
select * from final
Thank you so much Ankit Bansal. This is really helpful.
Very useful video
You are awesome 💌
You make it so easy, superb explanation
Hi Ankit, thanks for creating such videos.
Here is my approach:
with sequenced_order_table as(
select *, dense_rank() over(partition by customer_id order by order_date) as order_seq
from customer_orders)
SELECT order_date,
count(case when order_seq = 1 then customer_id end) as new_customer,
count(case when order_seq > 1 then customer_id end) as old_customer
FROM sequenced_order_table
group by 1
order by 1
Bro , did you check this in the db?
Love the way of explanation with step by step. 😀
🙏
awesome problem, Thank you so much for posting.
Day 1 Example 2 done
tysm for your video
here's my attempt
SELECT t1.order_date,
sum( CASe when t1.customer_id not in
(select t2.customer_id
from customer_orders as t2
WHERE t2.order_date=t1.order_date - INTERVAL '1day')
then 1 ELSE 0 end)
as news,
sum( CASe when t1.customer_id in
(select t2.customer_id
from customer_orders as t2
WHERE t2.order_date=t1.order_date - INTERVAL '1day')
then 1 ELSE 0 end)
as repeat
from customer_orders as t1
GROUP by t1.order_date
it is wrong tho
Hi everyone,
HW Task: add two columns of first_visit_order_amount, last_first_visit_order_amount
Solution:
sum(case when fv.first_visit_date = co.order_date then co.order_amount else 0 end) as first_visit_Order_amt_flag
, sum(case when fv.first_visit_date != co.order_date then co.order_amount else 0 end) as repeat_visit_order_amt_flag
add this two columns in Ankit's solution.
thanks buddy.
love your great content.
such a great explanation!!!
Hi Ankit..Thanks for your efforts.. I have an alternate solution as well
WITH CTE AS(
select *,CASE WHEN(DENSE_RANK()OVER(PARTITION BY customer_id ORDER BY order_date)=1) THEN 'New'
ELSE 'Repeat' END AS IND_CUSTOMER
from customer_orders
)
SELECT order_date,count(CASE WHEN IND_CUSTOMER='New' THEN order_id END) AS no_new_customer,
count(CASE WHEN IND_CUSTOMER='Repeat' THEN order_id END) AS no_repeat_customer
FROM CTE
GROUP BY order_date
ORDER BY order_date
Thanks for posting. This is also good. 👍
This was smooth.
Solved the question without looking into the solution in MySQL, I have used the concept of sum with case when after seeing it in your other video, it is very helpful and important concept:
with cte as
(
select *,
row_number() over(partition by customer_id) as rn
from customer_orders
order by order_date
)
select order_date,
sum(case when rn = 1 then 1 else 0 end) as new_customer_count,
sum(case when rn = 1 then 0 else 1 end) as repeat_customer_count
from cte
group by order_date;
Please let me know if there is some issue in this code
Nice one bro
I was asked this same question today in amazon interview. The question was lil changed but concept was same. They needed new user counts in a year 2022 only and wanted the output to be displayed as weekly level. So for week 1 how many new users till week 52. I was able to solve this though i took some time not sure if they judge on the speed as well. Thanks for this video
Thanks
Fanstastic channel.
This is perfect!!
Thank you !!
more help full
Thanks Ankit for your guidance. Please have a look below query
select sum(case when tc> 1 then 1 else 0 end )as repeat_customer,
sum(case when tc= 1 then 1 else 0 end )as new_customer from (select customer_id, count( customer_id) as tc
from customer_orders
group by customer_id) a ;
Best. Than kyou.
Very good question and very well explained. Great video Ankit :)
Thank you 😊
Which one approach is considered optimized the join one or without join ?
Subscribed on 2nd video in your channel, Great stuff.
Thank you 😊
Hey Ankit, I have used a different approach:
with new_table as(
select order_date,count(customer_id) as new_customer from customer_orders a
where 0=( select count(*) from customer_orders b where a.order_date>b.order_date and a.customer_id=b.customer_id) group by order_date),
repeat_table as (select order_date,count(customer_id) as old_customer from customer_orders a
where ( select count(*) from customer_orders b where a.order_date>b.order_date and a.customer_id=b.customer_id)>0 group by order_date)
select case when a.order_date is null then b.order_date else a.order_date end as date ,new_customer,old_customer from
new_table a full outer join repeat_table b on a.order_date=b.order_date;
Very nicely explained
Thank you so much 🙂
There is a small difference between the repeat customers (those purchased for the consecutive days) and old customers (no consecutive days condition).
For the repeat customers - purchasing for consecutive days
select order_date, sum(new_customer) as new_customer, sum(repeat_customer) as repeat_customer from
(select customer_id, order_date, case when order_date=first_visit then 1 else 0 end as new_customer,
case when date_diff(order_date, prev_day)=1 then 1 else 0 end as repeat_customer (
select customer_id, order_date, min(order_date) over (partition by customer_id) as first_visit , lag(order_date,1,0) over (partition by customer_id order by order_date) as prev_day from customer_orders)x)y group by order_date
i tried it and here is my solution:
with rn1 as(
select *,row_number() over(partition by customer_id order by order_date) as rn from customer_orders
)
select order_date,sum(case when rn =1 then 1 else 0 end) as new_customer,sum(case when rn > 1 then 1 else 0 end) as repeat_customer from rn1 group by order_date
finished watching
What a beautiful question, make your brain to hit hard.
can i also use window function
Thank you bro :)
hi ankith this is also working
with cte as (
SELECT *,min(order_date) over (partition by customer_id) as first_date
FROM customer_orders as a
)
select order_date,count(case when order_date first_date then customer_id end) as repeat,
count(case when order_date = first_date then customer_id end) as new,
count(customer_id) as total
from cte
group by order_date
Good explanation bro
Thanks Juhair 😊
Nice explanation Brother
want more such videos
thank you Brother 🙂
Sure
I have implemented with this logic.
with cte as (
select *,ROW_NUMBER() over(partition by customer_id order by order_date asc) as rnk from customer_orders),
cte_not_1 as (select order_date,count(*) as cnt from cte where rnk 1 group by order_date)
select * from (
select order_date,count(*) as new_customer_count from cte t1
where t1.rnk = 1
group by order_date) t1 left join cte_not_1 t2
on t1.order_date = t2.order_date
Hi Ankit if we need to add Customer_id also in the select list means, what we should do?
Your videos are amazing. Keep up the good work!
Thank you 😊
What if the same customer visits the website twice or thrice and orders each time? In that case, he should be a repeat customer. However, according to your solution, he won't be counted as a repeated customer as his min(order_date) = order_date.
What do you think?
However, your tutorials have been really helpful to me. Really appreciate your effort.
Hey so what do you think the solution for this ?
Could you please help in this ?
then I think we need timestamp as well not only the date part.
Well, he will be both new AND repeat customer as per current problem explanation. So in this case new problem explanation will be needed.
thank you
Hi Ankit can you also upload the video of assignment too ?
I used below query,
with cte as(
select *,min(order_date) over(partition by customer_id) as first_visit from customer_orders
)
select order_date,
sum(
case when order_date=first_visit then 1 else 0 end
) as first_time,
sum(
case when order_datefirst_visit then 1 else 0 end
) as sec_time
from cte
group by order_date
Thank you for posting.
Thanks
Day 2 of 47
Thanks for the video series
SELECT order_date,
SUM(CASE WHEN rn = 1 THEN 1 ELSE 0 END) first_customer,
SUM(CASE WHEN rn > 1 THEN 1 ELSE 0 END) repeated_customer
FROM (
SELECT customer_id,
order_date,
ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY order_date) AS rn
FROM customer_orders
) t
GROUP BY order_date
select order_date, sum(case when order_date =mn then 1 else 0 end) as new_customer ,sum(case when order_date mn then 1 else 0 end) as old_customer
from
(
select * ,min(order_date)over(partition by customer_id) as mn from customer_orders )
group by 1 order by 1
Hi Ankit could you suggest some resources for data modeling
Hey Ankit, Your videos are really awesome and informative.
Can you make some content or share resources regarding learn data analysis through python required for data analyst role
Will make. Thank you 😊
Without using join
***********************
with A as (select customer_id,order_date,lag(order_date) over (partition by customer_id) as previous_visit from customer_orders)
select
order_date,
sum(case when previous_visit is null then 1 else 0 end) as new_customer,
count(*)-sum(case when previous_visit is null then 1 else 0 end) as repeat_customer from A
group by order_date
order by order_date
Good one
@ankit bansal
can we also write this query in this way Ankit? Same output
select order_date,
count(case when rn = 1 then 'new' end) newcust,
count(case when rn != 1 then 'repeated' end) repcust from
(select
customer_id,
order_date,
row_number() over(partition by customer_id order by order_date asc ) 'rn'
from newrepeat) newt
group by order_date
order by order_date asc