No video

Complex SQL 2 | find new and repeat customers | SQL Interview Questions

  Рет қаралды 93,901

Ankit Bansal

Ankit Bansal

2 жыл бұрын

This video is about finding new and repeat customers .using SQL. In this video we will learn following concepts:
how to approach complex query step by step
how to use CASE WHEN with SUM
how to use common table expression (CTE)
Here is the script :
create table customer_orders (
order_id integer,
customer_id integer,
order_date date,
order_amount integer
);
select * from customer_orders
insert into customer_orders values(1,100,cast('2022-01-01' as date),2000),(2,200,cast('2022-01-01' as date),2500),(3,300,cast('2022-01-01' as date),2100)
,(4,100,cast('2022-01-02' as date),2000),(5,400,cast('2022-01-02' as date),2200),(6,500,cast('2022-01-02' as date),2700)
,(7,100,cast('2022-01-03' as date),3000),(8,400,cast('2022-01-03' as date),1000),(9,600,cast('2022-01-03' as date),3000)
;

Пікірлер: 608
@satyamgoyal942
@satyamgoyal942 2 жыл бұрын
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;
@ankitbansal6
@ankitbansal6 2 жыл бұрын
Good.
@tanushreesaha2276
@tanushreesaha2276 2 жыл бұрын
impressed
@psyche5184
@psyche5184 Жыл бұрын
A very good solution, I feel mine is overcomplicating things
@aniket9595
@aniket9595 Жыл бұрын
Nice one Satyam 😊
@TonnyPodiyan
@TonnyPodiyan Ай бұрын
Nice one bro
@mananyadav6401
@mananyadav6401 2 жыл бұрын
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 KZbin. 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.
@ankitbansal6
@ankitbansal6 2 жыл бұрын
Thats a big compliment for me. Keep rocking 😊
@shankrukulkarni3234
@shankrukulkarni3234 Жыл бұрын
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
@mansipuhan4827
@mansipuhan4827 Жыл бұрын
Same for me also
@Tusharchitrakar
@Tusharchitrakar 11 ай бұрын
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
@sowmya6471
@sowmya6471 10 ай бұрын
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.
@BhanuGupta-x2j
@BhanuGupta-x2j 4 күн бұрын
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;
@ankitbiswas8380
@ankitbiswas8380 2 жыл бұрын
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 .
@ankitbansal6
@ankitbansal6 2 жыл бұрын
Cool
@siddhantsoni1575
@siddhantsoni1575 2 жыл бұрын
@@ankitbansal6 I was also asked this questions
@sachinkapoor2424
@sachinkapoor2424 Жыл бұрын
For which job position ankit
@ankitbiswas8380
@ankitbiswas8380 Жыл бұрын
@@sachinkapoor2424 DS
@kartikjuneja7807
@kartikjuneja7807 Жыл бұрын
For how many years experience did you apply?
@PraveenSinghRathore-df3td
@PraveenSinghRathore-df3td 3 ай бұрын
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;
@swethathiruppathy9973
@swethathiruppathy9973 7 ай бұрын
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 ;
@devendrabhumarapu7869
@devendrabhumarapu7869 2 жыл бұрын
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;
@yashwani209
@yashwani209 Жыл бұрын
Now i will never Forget CTE... Great teaching skill
@kothapalliramana4955
@kothapalliramana4955 2 жыл бұрын
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;
@ankitbansal6
@ankitbansal6 2 жыл бұрын
This is good. Thanks for posting 👏
@rakeshchaudhary3055
@rakeshchaudhary3055 2 жыл бұрын
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
@ls47295
@ls47295 Жыл бұрын
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..
@Ian15278
@Ian15278 Ай бұрын
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;
@Nikhilg-rs7iv
@Nikhilg-rs7iv 3 ай бұрын
seriously no one in the entire youtube explained CTE like this. Made it so simple thank you ankit bro
@ankitbansal6
@ankitbansal6 3 ай бұрын
🙏
@maxsteel4590
@maxsteel4590 Жыл бұрын
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
@ankitbansal6
@ankitbansal6 Жыл бұрын
Glad to know 🙏
@m04d10y1996
@m04d10y1996 2 ай бұрын
You got this for which profile.
@maxsteel4590
@maxsteel4590 Ай бұрын
@@m04d10y1996 Product analytics
@gagansingh3481
@gagansingh3481 2 жыл бұрын
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
@arijitsaha5499
@arijitsaha5499 Жыл бұрын
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
@kartikjuneja7807
@kartikjuneja7807 Жыл бұрын
Bro , did you check this in the db?
@Prasad1487
@Prasad1487 Ай бұрын
MY only SQL guru.. Thank you guruji.. love you for ever.
@susmitakundu6120
@susmitakundu6120 Ай бұрын
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 ;
@shubhamchakravorty
@shubhamchakravorty 11 ай бұрын
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;
@tamojeetchatterjee9385
@tamojeetchatterjee9385 Ай бұрын
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
@vigneshshetty2149
@vigneshshetty2149 11 ай бұрын
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;
@rakeshpanigrahi577
@rakeshpanigrahi577 2 ай бұрын
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;
@ft_peakhd2921
@ft_peakhd2921 Жыл бұрын
I solved this using Window functions and cte, My solution: with cte as (select customer_id,row_number() over(partition by customer_id order by customer_id) num,order_date from customer_orders group by customer_id,order_date) select order_date, sum(case when num=1 then 1 else 0 end ) as new_cust,sum(case when num>1 then 1 else 0 end) repeat_cust from cte group by order_date;
@rakshithareddy498
@rakshithareddy498 Жыл бұрын
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
@Mayank-jw9yy
@Mayank-jw9yy 5 ай бұрын
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
@zeeshanahmed2594
@zeeshanahmed2594 10 ай бұрын
Thank you very much Sir, for this practical question and your step by step explanation.
@ankitbansal6
@ankitbansal6 10 ай бұрын
You are most welcome
@debashreesarkar1403
@debashreesarkar1403 Жыл бұрын
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
@debashreesarkar1403
@debashreesarkar1403 Жыл бұрын
using lag function with cte
@jainwho
@jainwho Жыл бұрын
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
@suman3316
@suman3316 2 жыл бұрын
this what a real time problems...thanks and keep bring such
@ankitbansal6
@ankitbansal6 2 жыл бұрын
Sure. Thanks.
@ujjwalvarshney3188
@ujjwalvarshney3188 Жыл бұрын
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
@bukunmiadebanjo9684
@bukunmiadebanjo9684 Жыл бұрын
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
@husnabanu4370
@husnabanu4370 Жыл бұрын
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
@florincopaci6821
@florincopaci6821 2 жыл бұрын
Thank you for this video! Please come with problems like this. Thank you
@ankitbansal6
@ankitbansal6 2 жыл бұрын
Sure.
@mohdtoufique7446
@mohdtoufique7446 2 жыл бұрын
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
@ankitbansal6
@ankitbansal6 2 жыл бұрын
Thanks for posting. This is also good. 👍
@SundarKumar-pg6wx
@SundarKumar-pg6wx Жыл бұрын
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
@anishchhabra6085
@anishchhabra6085 6 ай бұрын
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
@techlearnersmarathi5461
@techlearnersmarathi5461 Жыл бұрын
Thanks for sharing this problem and approach behind same. below is my query select co.order_date, sum(case when CO.order_date= fv.first_date then 1 else 0 end) as no_of_new_cust, sum(case when CO.order_date!= fv.first_date then 1 else 0 end) as no_of_repeat_cust, sum(case when CO.order_date= fv.first_date then order_amount else 0 end) as total_amount_by_new_cust, sum(case when CO.order_date!= fv.first_date then order_amount else 0 end) as total_amount_by_old_cust from [dbo].[customer_orders] co inner join (select customer_id, min(order_date) as first_date from [dbo].[customer_orders] group by customer_id) fv on co.customer_id=fv.customer_id group by order_date order by CO.order_date;
@parth_pm16
@parth_pm16 Жыл бұрын
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.
@abhishekjain4895
@abhishekjain4895 11 ай бұрын
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;
@saib7231
@saib7231 10 ай бұрын
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
@user-yk4xd4gk6o
@user-yk4xd4gk6o Жыл бұрын
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;
@MyTetere
@MyTetere 4 ай бұрын
This is a clear and concise explanation
@sarveshrajan88
@sarveshrajan88 7 ай бұрын
Amazing Video Ankit, Commenting my approach SELECT B.order_date, SUM(CASE WHEN FC.customer_id IS NULL THEN 0 ELSE 1 END) AS NEW_CUSTOMER_COUNT ,SUM(CASE WHEN FC.customer_id IS NULL THEN 1 ELSE 0 END) AS REPEAT_CUSTOMER_COUN ,SUM(CASE WHEN FC.CUSTOMER_ID IS NOT NULL THEN B.ORDER_AMOUNT ELSE 0 END) AS NEW_CUSTOMER_SUM ,SUM(CASE WHEN FC.customer_id IS NULL THEN B.order_amount ELSE 0 END) AS REPEAT_CUSTOMER_SUM FROM customer_orders AS B LEFT JOIN (SELECT A.CUSTOMER_ID,A.order_date,ROW_NUMBER() OVER(PARTITION BY A.CUSTOMER_ID ORDER BY A.ORDER_DATE) AS RNK FROM customer_orders AS A) AS FC ON B.order_date=FC.order_date AND B.customer_id=FC.customer_id AND FC.RNK='1' GROUP BY B.order_date
@plumbarch
@plumbarch 2 жыл бұрын
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
@bapanbairagya9642
@bapanbairagya9642 3 ай бұрын
awesome problem, Thank you so much for posting.
@techmania979
@techmania979 Жыл бұрын
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
@ankitbansal6
@ankitbansal6 Жыл бұрын
Thank you for posting.
@Ashu23200
@Ashu23200 3 ай бұрын
My assignment query with cte as ( select customer_id, order_date, order_amount, MIN(order_date) over (partition by customer_id) as first_order_date from customer_orders ) , cte2 as ( select *, case when order_date = first_order_date then 'New_Customer' else 'Repeat_Customer' end as Customer_Type --, COUNT(1) as mnjh from cte ) select Customer_Type,COUNT(1) as Count_of_Customers ,sum(order_amount) as sales from cte2 group by Customer_Type
@arthurmorgan9010
@arthurmorgan9010 Жыл бұрын
My solution was: with firsttable(customerid,firstorderdate) as ( select customer_id,min(order_date) as first_order_date from customer_orders group by customer_id ) select order_date,sum(case when (customerid = customer_id and firstorderdate = order_date) then 1 else 0 end) as newcustomer, sum(case when (customerid = customer_id and firstorderdate != order_date) then 1 else 0 end) as oldcustomer from customer_orders,firsttable group by order_date
@smitpatel8782
@smitpatel8782 8 ай бұрын
select c.order_date , sum(case when c.customer_id in (select co.customer_id from customer_orders co where co.order_date < c.order_date) then 1 else 0 end) as Repeat_customer, sum(case when c.customer_id not in (select co.customer_id from customer_orders co where co.order_date < c.order_date) then 1 else 0 end) as Not_Repeat_customer from customer_orders c group by 1
@bhajans-m3l
@bhajans-m3l 7 ай бұрын
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
@GanesanDinesh
@GanesanDinesh 2 жыл бұрын
Hi Ankit, Thanks for your effort ;with cte_1 as (Select customer_id,order_date, row_number() over(partition by customer_id order by min(order_date)) as first_order_date from customer_orders group by customer_id,order_date ) select order_date, sum(case when first_order_date = 1 then 1 else 0 end) as first_visit, sum(case when first_order_date > 1 then 1 else 0 end )as repeated_visit from cte_1 group by order_date
@ankitbansal6
@ankitbansal6 2 жыл бұрын
Looks good. Keep rocking 😊
@rahuldave6699
@rahuldave6699 9 ай бұрын
My solution with cte as( select *, rank() over (partition by customer_id order by order_date) as rnk from customer_orders) select order_date ,count(case when rnk = 1 then 1 else Null end ) as new_customer, count(case when rnk>1 then 1 else Null end) as repeat_customer from cte group by order_date
@IndianHacker-hisBest
@IndianHacker-hisBest 10 ай бұрын
Really good channel and informative videos.
@ankitbansal6
@ankitbansal6 10 ай бұрын
Glad you like them!
@shubhamgoyal5227
@shubhamgoyal5227 Күн бұрын
GREAT QUESTION ANKIT SIR HERE IS MY APPROACH: WITH CTE AS( SELECT * , ROW_NUMBER()OVER(PARTITION BY CUSTOMER_ID ORDER BY ORDER_DATE)RN FROM customer_orders) ,CTE_2 AS( SELECT *, CASE WHEN RN=1 THEN 1 ELSE NULL END AS NEW_CUST, CASE WHEN RN>1 THEN 1 ELSE NULL END AS REPEATED, CASE WHEN RN=1 THEN order_amount ELSE NULL END NEW_CUST_AMOUNT, CASE WHEN RN>1 THEN order_amount ELSE NULL END REPEATED_CUST_AMOUNT FROM CTE) SELECT order_date, COUNT(NEW_CUST) NEW_CUSTOMER_COUNT, COUNT(REPEATED) REPEATED_CUSTOMER_COUNT ,ISNULL(SUM(NEW_CUST_AMOUNT),0) AMOUNT_FROM_NEW_CUSTOMER ,ISNULL(SUM(REPEATED_CUST_AMOUNT),0)AMOUNT_FROM_REPEATED_CUSTOMER FROM CTE_2 GROUP BY order_date
@user-ok8ou9ro2y
@user-ok8ou9ro2y 4 ай бұрын
with CTE as ( select *, dense_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_order, sum(case when rnk1 then 1 else 0 end ) as repaet_customer from CTE group by order_date
@pragatiaggarwal8103
@pragatiaggarwal8103 26 күн бұрын
You are awesome 💌
@ashish-blessings
@ashish-blessings Жыл бұрын
Thank you so much Ankit Bansal. This is really helpful.
@shourya4092
@shourya4092 Жыл бұрын
What a Explanation mind blowing ❤️❤️❤️
@ankitbansal6
@ankitbansal6 Жыл бұрын
Thank you so much 😀
@ajeshrajan8079
@ajeshrajan8079 Жыл бұрын
Great explanation for both approach and solution
@ankitbansal6
@ankitbansal6 Жыл бұрын
Glad you liked it
@KoushikT
@KoushikT 2 жыл бұрын
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
@ankitbansal6
@ankitbansal6 2 жыл бұрын
Good one
@akashkamble9902
@akashkamble9902 Жыл бұрын
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
@debabratabar2008
@debabratabar2008 Ай бұрын
Hi ankit , added solution for assignment part with customer_first_ord_dt as ( select customer_id , min( order_date) as first_order_date from customer_orders group by 1 ) , final_temp_table as ( select * , case when order_date = first_order_date then 1 else 0 end as new_customer_count , case when order_date != first_order_date then 1 else 0 end as repeat_customer_count from customer_orders co inner join customer_first_ord_dt as cot on co.customer_id = cot.customer_id ) 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 , sum( case when new_customer_count = 1 then order_amount else 0 end) as new_customer_sales, sum( case when repeat_customer_count = 1 then order_amount else 0 end) as repeat_customer_sales from final_temp_table group by 1 order by 1
@janhavighuge7095
@janhavighuge7095 Жыл бұрын
Thankyou for another great question! My solution to this question: SELECT new.order_date, COUNT(CASE WHEN previous.customer_id IS NULL THEN 1 END) AS new_cust, COUNT(DISTINCT(CASE WHEN previous.customer_id IS NOT NULL THEN previous.customer_id END)) AS repeat_cust, SUM(CASE WHEN previous.customer_id IS NULL THEN new.order_amount END) AS amount_by_new_cust, SUM(DISTINCT(CASE WHEN previous.customer_id IS NOT NULL THEN new.order_amount ELSE 0 END)) AS amount_by_repeat_cust FROM customer_orders new LEFT JOIN customer_orders previous ON previous.customer_id = new.customer_id AND previous.order_date < new.order_date GROUP BY new.order_date;
@Brown_Munda_oo7
@Brown_Munda_oo7 Жыл бұрын
VERY Good Query
@keerthanakalyanapu7475
@keerthanakalyanapu7475 Жыл бұрын
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, Sum(Case when a.order_date = a.first_order_date then A.order_amount else 0 end) as new_customer_amt, Sum(Case when a.order_date != a.first_order_date then A.order_amount else 0 end) as repeat_customer_amt from( Select customer_id, order_date,order_amount, min(order_date) over(partition by customer_id) as first_order_date from customer_orders) a group by a.order_date order by a.order_date;
@vaibhavtiwari8670
@vaibhavtiwari8670 Жыл бұрын
# 1 asigmnet solution case when first_visit_date=order_date then order_amount else 0 end as amount_spend_new, case when first_visit_date!=order_date then order_amount else 0 end as amount_spend_old select sum(amount_spend_new) as new_customer_spend,sum(amount_spend_old) as old_customer_spend,sum(new_customer) as new_customers,sum(repeat_customer) as repeat_customer,order_date from customer group by order_date assignment completed
@kunnalkhatreja6191
@kunnalkhatreja6191 Жыл бұрын
select b.order_date,sum(case when a.first_order = b.order_date then 1 else 0 end) as first_time_customers, Sum(case when a.first_order b.order_date then 1 else 0 end) as repeat_customers, sum(case when a.first_order = b.order_date then order_amount end) as new_cust_order,sum(case when a.first_order b.order_date then order_amount end) as repeat_cust_order from (select customer_id,min(order_date) as first_order from customer_orders group by customer_id) a join customer_orders b on a.customer_id=b.customer_id group by b.order_date
@saurabhsomkuwar1276
@saurabhsomkuwar1276 2 жыл бұрын
Wow Ankit, your videos on SQL are so good, informative and helpful. Thanks a lot for making them. Keep going.
@ankitbansal6
@ankitbansal6 2 жыл бұрын
Thank you 😊
@sandeepanmahapatra4888
@sandeepanmahapatra4888 4 ай бұрын
This was my approach, using RANK() concept - WITH Orders_with_rank AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY order_date) AS Order_rank, CASE WHEN Order_rank = 1 THEN 1 ELSE 0 END AS "New Customer" , CASE WHEN Order_rank > 1 THEN 1 ELSE 0 END AS "Returning Customer" FROM customer_orders ) SELECT order_date, SUM("New Customer") AS "New Customers", SUM("Returning Customer") AS "Returning Customers" FROM Orders_with_rank GROUP BY order_date
@ashwingupta4765
@ashwingupta4765 2 ай бұрын
Query with Assignment with cte as ( select *, min(order_date) over(partition by customer_id) as first_vist_date from customer_orders ) Select order_date, sum(case when order_date = first_vist_date then 1 else 0 end) as first_customer, sum(case when order_date!=first_vist_date then 1 else 0 end) as repeat_customer, sum(case when order_date = first_vist_date then order_amount else 0 end) as first_customer_amount, sum(case when order_date!=first_vist_date then order_amount else 0 end) as repeat_customer_amount from cte group by order_date
@vijaygupta7059
@vijaygupta7059 4 ай бұрын
using other method with cte as( Select * , case when customer_id in (select customer_id from customer_orders where order_date
@dfkgjdflkg
@dfkgjdflkg 3 ай бұрын
love your great content.
@akashwatar6633
@akashwatar6633 Жыл бұрын
I am planning to complete all the SQL videos created by you in order to learn SQL. I will post a comment on each video and like it as a checklist for completed videos, starting from the beginning.
@nidhisingh4973
@nidhisingh4973 Жыл бұрын
----------------count of new and repeat customer with cte as( select customer_id, order_date,case when order_date =min(order_date) over (partition by customer_id) then 'New customer' end as new, case when order_date min(order_date) over (partition by customer_id) then 'Repeat' end as r from customer_orders) select distinct order_date, count(new) as new_customer ,count(r) as repeat_customer from cte group by order_date
@md.shabbirhossainbhuiyea4363
@md.shabbirhossainbhuiyea4363 Жыл бұрын
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.
@mdfurqan
@mdfurqan Жыл бұрын
Hey so what do you think the solution for this ? Could you please help in this ?
@vandanaK-mh9zo
@vandanaK-mh9zo Жыл бұрын
then I think we need timestamp as well not only the date part.
@mocococo2877
@mocococo2877 Жыл бұрын
Well, he will be both new AND repeat customer as per current problem explanation. So in this case new problem explanation will be needed.
@user-ze4xc6tu4f
@user-ze4xc6tu4f 2 жыл бұрын
best step by step practice
@prashant887
@prashant887 2 жыл бұрын
with temp as ( select cust_id,order_date,lag(order_date) over(PARTITION by cust_id order by order_date) as prev_order from cust_orders ) select trunc(order_date), sum(case when prev_order is null then 1 else 0 end) first,sum(case when prev_order is null then 0 else 1 end) as prev from temp group by trunc(order_date);
@ankitbansal6
@ankitbansal6 2 жыл бұрын
Thanks for posting 👏
@harshithapolisetty3501
@harshithapolisetty3501 25 күн бұрын
with cte as(select order_id,customer_id,order_date,order_amount, row_number() over (partition by customer_id order by order_Date) as rk from customer_orders ) select order_date, sum(case when rk=1 then 1 else 0 end) as new, sum(case when rk>1 then 1 else 0 end) as repeat from cte group by order_date
@gauravgupta5530
@gauravgupta5530 Жыл бұрын
What a beautiful question, make your brain to hit hard.
@kinzorize
@kinzorize Жыл бұрын
correct query in case you are facing error in creating the table : CREATE TABLE customer_orders ( order_id integer, customer_id integer, order_date date, order_amount integer ); INSERT INTO customer_orders VALUES (1, 100, '2022-01-01', 2000), (2, 200, '2022-01-01', 2500), (3, 300, '2022-01-01', 2100), (4, 100, '2022-01-02', 2000), (5, 400, '2022-01-02', 2200), (6, 500, '2022-01-02', 2700), (7, 100, '2022-01-03', 3000), (8, 400, '2022-01-03', 1000), (9, 600, '2022-01-03', 3000);
@vinaykumar-hb7rf
@vinaykumar-hb7rf 2 жыл бұрын
Love the way of explanation with step by step. 😀
@ankitbansal6
@ankitbansal6 2 жыл бұрын
🙏
@vijaypalmanit
@vijaypalmanit 2 жыл бұрын
You make it so easy, superb explanation
@suriyas6338
@suriyas6338 Жыл бұрын
Hi Aniket, Here is my solution :) with cte1 as( select *, ROW_NUMBER() OVER(PARTITION BY customer_id order by order_date) as row_num from customer_orders ) select order_date, sum(case when row_num = 1 then 1 else 0 end) as new_cus, sum(case when row_num > 1 then 1 else 0 end) as rep_cus, sum(case when row_num =1 then order_amount else 0 end) as newCus_order_amnt, sum(case when row_num >1 then order_amount else 0 end) as repCus_order_amnt from cte1 group by order_date
@Mahi_RSV
@Mahi_RSV 9 ай бұрын
New and repeat customers each day: with cte_1 as ( select customer_id,order_date,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_customers, sum(case when rnk>1 then 1 else 0 end ) as repeat_customers from cte_1 group by order_date Sales by New and repeat customers each day: with cte_1 as ( select 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 order_amount else 0 end ) as new_customers_sales, sum(case when rnk>1 then order_amount else 0 end ) as repeat_customers_sales from cte_1 group by order_date Enjoyed solving this question! Thanks Ankit Bhai :)
@prekshasharma1216
@prekshasharma1216 Жыл бұрын
Assignment: with CTE as( select customer_id, min(order_date) as first_visit from customer_orders group by customer_id) select c.order_date, sum(case when c.order_date = t.first_visit then 1 else 0 end) as first_visit_flag, sum(case when c.order_date != t.first_visit then 1 else 0 end) as repeat_visit_flag, sum(case when c.order_date = t.first_visit then order_amount else 0 end) as first_visit_amount, sum(case when c.order_date != t.first_visit then order_amount else 0 end) as repeat_visit_amount from customer_orders c join CTE t on c.customer_id = t.customer_id group by order_date order by order_date
@venkataram6460
@venkataram6460 2 жыл бұрын
Nice work Ankit, your way of solving the problem is simple but effective.
@RajneeshDabral
@RajneeshDabral 3 ай бұрын
with cte as ( select order_date,status,count(*) as flag from ( select *,case when rnk in(1) then 'New' else 'Repeat' end as 'status' from ( select *,ROW_NUMBER()over(partition by customer_id order by order_date) as rnk from customer_orders) f ) g group by order_date,status ),cte2 as ( select order_date,sum(case when status = 'New' then flag end) as 'New', sum(case when status = 'Repeat' then flag end) as 'Repeat' from cte group by order_date) select order_date,ISNULL(New,0) as 'New',ISNULL(Repeat,0) as 'Repeat'from cte2
@AbhishekSabharwal131997
@AbhishekSabharwal131997 4 ай бұрын
with cte as ( select customer_id,order_date, row_number() over (partition by customer_id order by order_date) as rw from customer_orders ) select order_date, sum(case when rw =1 then 1 else 0 end) as Newcust, sum(case when rw>1 then 1 else 0 end) as old from cte group by 1
@ayushtyagi4240
@ayushtyagi4240 Жыл бұрын
My sol : with temp as (select * , row_number() over (partition by customer_id ) visits from customer_orders order by order_date ) , temp2 as ( select order_date , case when visits = 1 then 1 else 0 end as fresh , case when visits != 1 then 1 else 0 end as repeated from temp ) select order_date , sum(fresh) new_customers , sum(repeated) repeat_customers from temp2 group by 1 order by 1
@priyanikalje-fg4mw
@priyanikalje-fg4mw Жыл бұрын
Today exactly same question was asked to Me for Cummins.
@dakshbhatnagar
@dakshbhatnagar 2 ай бұрын
with cte as ( select *, case when row_number() over(partition by customer_id order by order_date) = 1 then 'new' else 'repeat' end as flag from customer_orders) select order_date, flag, count(flag) as Count from cte group by order_date, flag order by order_date
@harshSingh-if4zb
@harshSingh-if4zb 2 жыл бұрын
with cte as( select distinct cust_id, first_value(order_dt) over(partition by cust_id order by order_dt) as fv from emp ) select order_dt, sum(case when c.fv = e.order_dt then 1 else 0 end ) as first_visit ,sum(case when c.fv e.order_dt then 1 else 0 end ) as repete_visit from emp e join cte c on e.cust_id = c.cust_id group by e.order_dt
@mahenpriy
@mahenpriy Жыл бұрын
awesome explanation ...
@ramyagaraga3791
@ramyagaraga3791 5 ай бұрын
Assignment Query: select A.order_date,sum(case when A.rn =1 then 1 else 0 end) as new_custmer_count, sum(case when A.rn >1 then 1 else 0 end) as repeat_customer_count, sum(case when A.rn =1 then A.ORDER_AMOUNT else 0 end) as sum_new_customer_order_amount, sum(case when A.rn >1 then A.ORDER_AMOUNT else 0 end) as sum_repeat_customer_order_amount from (select customer_id,order_date,order_amount, row_number() over(partition by customer_id order by order_date asc) as rn from customer_orders)A group by A.order_date;
@muhammedjunaisk4835
@muhammedjunaisk4835 2 ай бұрын
select order_date,sum(new_cust_i) as new_csutomers,(count(customer_id)-sum(new_cust_i)) as old_customers from ( select *,new_cust_i=case when customer_id not in (select customer_id from customer_orders c2 where c2.order_date
@user-kg1tt8pw4t
@user-kg1tt8pw4t Жыл бұрын
with temp as( select order_date, case when customer_id in (select customer_id from customer_orders c2 where c2.order_date
@varunanr5433
@varunanr5433 Ай бұрын
my approach - select t.order_date, t.New_Customer_Count, coalesce((b.repeated_customer_count),0) as Repeated_Customer_Count from (select order_date, count(*) as New_Customer_Count from (select *, row_number() over(partition by customer_id) as rn from customer_orders) as new_customer where rn = 1 Group by order_date) as t left join (select order_date, count(*) as repeated_customer_count from (select *, row_number() over(partition by customer_id) as rn from customer_orders) as new_customer where rn > 1 Group by order_date) as b on t.order_date=b.order_date
@DriveWhisperer
@DriveWhisperer Жыл бұрын
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
@gandlapentasabjan9115
@gandlapentasabjan9115 5 ай бұрын
Task output: with cte as (select customer_id,order_date,order_amount,min(order_date) over (partition by customer_id order by order_date) as first_visit_date from customer_orders) select order_date ,sum(case when order_date=first_visit_date then order_amount end) as new_customer_order_amount ,sum(case when order_date!=first_visit_date then order_amount end) as Repeast_customer_order_amount ,sum(case when order_date=first_visit_date then 1 else 0 end) as new_customer ,sum(case when order_date!=first_visit_date then 1 else 0 end) as repeat_customer from cte group by order_date;
@sajanpradhan1539
@sajanpradhan1539 2 жыл бұрын
such a great explanation!!!
@ayushsrivastav8220
@ayushsrivastav8220 10 ай бұрын
with cte1 as( select *, row_number() over(partition by customer_id order by order_date) as rn from customer_orders) select order_date, count(case when rn=1 then 1 else null end) as new_orders, count(case when rn!=1 then 1 else null end) as repeat_orders from cte1 group by order_date
@sumanacharya461
@sumanacharya461 Жыл бұрын
my solution - with rp as (SELECT customer_id,order_date, rank() over (partition by customer_id order by order_date) 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,sum(case when rn > 1 then 1 else 0 end) as old_customer from rp group by 1 order by 1
The Joker saves Harley Quinn from drowning!#joker  #shorts
00:34
Untitled Joker
Рет қаралды 59 МЛН
Can This Bubble Save My Life? 😱
00:55
Topper Guild
Рет қаралды 53 МЛН
Советы на всё лето 4 @postworkllc
00:23
История одного вокалиста
Рет қаралды 5 МЛН
Complex SQL Query 1 | Derive Points table for ICC tournament
9:03
Ankit Bansal
Рет қаралды 187 М.
Practice SQL Interview Query | Big 4 Interview Question
14:47
The Joker saves Harley Quinn from drowning!#joker  #shorts
00:34
Untitled Joker
Рет қаралды 59 МЛН