Тёмный

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

Ankit Bansal
Подписаться 109 тыс.
Просмотров 90 тыс.
50% 1

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

Опубликовано:

 

14 янв 2022

Поделиться:

Ссылка:

Скачать:

Готовим ссылку...

Добавить в:

Мой плейлист
Посмотреть позже
Комментарии : 594   
@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 Год назад
impressed
@psyche5184
@psyche5184 Год назад
A very good solution, I feel mine is overcomplicating things
@aniket9595
@aniket9595 Год назад
Nice one Satyam 😊
@TonnyPodiyan
@TonnyPodiyan 19 дней назад
Nice one bro
@yashwani209
@yashwani209 Год назад
Now i will never Forget CTE... Great teaching skill
@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 RU-vid. 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 9 месяцев назад
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.
@shubhamchakravorty
@shubhamchakravorty 10 месяцев назад
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;
@Nikhilg-rs7iv
@Nikhilg-rs7iv 2 месяца назад
seriously no one in the entire youtube explained CTE like this. Made it so simple thank you ankit bro
@ankitbansal6
@ankitbansal6 2 месяца назад
🙏
@venkataram6460
@venkataram6460 2 года назад
Nice work Ankit, your way of solving the problem is simple but effective.
@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;
@ashish-blessings
@ashish-blessings Год назад
Thank you so much Ankit Bansal. This is really helpful.
@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 😊
@sajanpradhan1539
@sajanpradhan1539 Год назад
such a great explanation!!!
@suman3316
@suman3316 2 года назад
this what a real time problems...thanks and keep bring such
@ankitbansal6
@ankitbansal6 2 года назад
Sure. Thanks.
@vijaypalmanit
@vijaypalmanit Год назад
You make it so easy, superb explanation
@user-ze4xc6tu4f
@user-ze4xc6tu4f 2 года назад
best step by step practice
@bapanbairagya9642
@bapanbairagya9642 2 месяца назад
awesome problem, Thank you so much for posting.
@himanshupathak3090
@himanshupathak3090 2 года назад
Your videos are amazing. Keep up the good work!
@ankitbansal6
@ankitbansal6 2 года назад
Thank you 😊
@mahenpriy
@mahenpriy Год назад
awesome explanation ...
@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 Месяц назад
You got this for which profile.
@maxsteel4590
@maxsteel4590 9 дней назад
@@m04d10y1996 Product analytics
@MyTetere
@MyTetere 3 месяца назад
This is a clear and concise explanation
@Prasad1487
@Prasad1487 18 дней назад
MY only SQL guru.. Thank you guruji.. love you for ever.
@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
@vinaykumar-hb7rf
@vinaykumar-hb7rf 2 года назад
Love the way of explanation with step by step. 😀
@ankitbansal6
@ankitbansal6 2 года назад
🙏
@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;
@dfkgjdflkg
@dfkgjdflkg 3 месяца назад
love your great content.
@suneelsunkari4354
@suneelsunkari4354 2 года назад
Very useful video
@anirvansen5024
@anirvansen5024 2 года назад
Subscribed on 2nd video in your channel, Great stuff.
@ankitbansal6
@ankitbansal6 2 года назад
Thank you 😊
@Brown_Munda_oo7
@Brown_Munda_oo7 Год назад
VERY Good Query
@user-yk4xd4gk6o
@user-yk4xd4gk6o 11 месяцев назад
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;
@florincopaci6821
@florincopaci6821 2 года назад
Thank you for this video! Please come with problems like this. Thank you
@ankitbansal6
@ankitbansal6 2 года назад
Sure.
@zeeshanahmed2594
@zeeshanahmed2594 9 месяцев назад
Thank you very much Sir, for this practical question and your step by step explanation.
@ankitbansal6
@ankitbansal6 9 месяцев назад
You are most welcome
@devendrabhumarapu7869
@devendrabhumarapu7869 Год назад
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;
@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
@swethathiruppathy9973
@swethathiruppathy9973 6 месяцев назад
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 ;
@shourya4092
@shourya4092 Год назад
What a Explanation mind blowing ❤️❤️❤️
@ankitbansal6
@ankitbansal6 Год назад
Thank you so much 😀
@khanmahebullahnisarahmed912
@khanmahebullahnisarahmed912 2 года назад
Nice explanation Brother want more such videos thank you Brother 🙂
@ankitbansal6
@ankitbansal6 2 года назад
Sure
@ajeshrajan8079
@ajeshrajan8079 Год назад
Great explanation for both approach and solution
@ankitbansal6
@ankitbansal6 Год назад
Glad you liked it
@VijayNaramalli
@VijayNaramalli Год назад
Best tutor
@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..
@kanchankumar3355
@kanchankumar3355 2 года назад
This is perfect!!
@ankitbansal6
@ankitbansal6 2 года назад
Thank you !!
@vigneshaaseevagar7784
@vigneshaaseevagar7784 Год назад
This was smooth.
@IndianHacker-hisBest
@IndianHacker-hisBest 9 месяцев назад
Really good channel and informative videos.
@ankitbansal6
@ankitbansal6 9 месяцев назад
Glad you like them!
@kuchamancity1
@kuchamancity1 3 месяца назад
Nice totala
@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?
@Ian15278
@Ian15278 17 дней назад
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;
@tamojeetchatterjee9385
@tamojeetchatterjee9385 29 дней назад
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
@fahadmahmood7150
@fahadmahmood7150 Год назад
Very good question and very well explained. Great video Ankit :)
@ankitbansal6
@ankitbansal6 Год назад
Thank you 😊
@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
@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
@CL-em1tk
@CL-em1tk Год назад
Best. Than kyou.
@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
@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;
@saib7231
@saib7231 9 месяцев назад
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
@gauravgupta5530
@gauravgupta5530 11 месяцев назад
What a beautiful question, make your brain to hit hard.
@swamivivekananda-cyclonicm8781
Fanstastic channel.
@pragatiaggarwal8103
@pragatiaggarwal8103 16 часов назад
You are awesome 💌
@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.
@juhairahamed5342
@juhairahamed5342 2 года назад
Good explanation bro
@ankitbansal6
@ankitbansal6 2 года назад
Thanks Juhair 😊
@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. 👍
@zohebakber5056
@zohebakber5056 2 года назад
Nice
@ankitbansal6
@ankitbansal6 2 года назад
Thanks 🙏
@kanchidoshi6907
@kanchidoshi6907 2 года назад
Can you pls share consolidated list of Easy and Medium SQLs if possible I'm xls or pdf format?
@arpittiwari1589
@arpittiwari1589 Год назад
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
@ankitbansal6
@ankitbansal6 Год назад
Will make. Thank you 😊
@pavitrashailaja850
@pavitrashailaja850 2 года назад
Very nicely explained
@ankitbansal6
@ankitbansal6 2 года назад
Thank you so much 🙂
@user-by8yn6my6d
@user-by8yn6my6d 4 месяца назад
more help full
@rakeshpanigrahi577
@rakeshpanigrahi577 Месяц назад
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;
@abhishekjain4895
@abhishekjain4895 10 месяцев назад
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;
@fog2640
@fog2640 8 месяцев назад
finished watching
@priyanikalje-fg4mw
@priyanikalje-fg4mw Год назад
Today exactly same question was asked to Me for Cummins.
@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
@susmitakundu6120
@susmitakundu6120 21 день назад
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 ;
@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
@anthonychilaka
@anthonychilaka 8 месяцев назад
Day 2 of 47 Thanks for the video series
@01kumarr
@01kumarr Год назад
thank you
@themightyvk
@themightyvk 11 месяцев назад
Thanks
@rajasundar9547
@rajasundar9547 Год назад
@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
@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
@shraddhadixit2768
@shraddhadixit2768 2 месяца назад
Day 1 Example 2 done
@user-jh4ey6qd8u
@user-jh4ey6qd8u 11 месяцев назад
Hi Ankit if we need to add Customer_id also in the select list means, what we should do?
@bukunmiadebanjo9684
@bukunmiadebanjo9684 11 месяцев назад
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
@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.
@giridhararaomaddirala2472
@giridhararaomaddirala2472 2 года назад
Hi Ankit could you suggest some resources for data modeling
@letztalkufc
@letztalkufc Год назад
hi there may i know why i am getting syntax error following the same in pg admin and mysql
@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
@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.
@snehasiktachandra4357
@snehasiktachandra4357 2 года назад
very helpful. Can you please create a playlist for python qiestions asked in Data Engineering interview ?
@ankitbansal6
@ankitbansal6 2 года назад
Ok
@prabhatgupta6415
@prabhatgupta6415 Год назад
@@ankitbansal6 Ankit please bring python questions too... as same as sql. You have got great teaching skills. Make videos to crack DE for Amazon
@AviralVerma-id9ds
@AviralVerma-id9ds 3 месяца назад
Hi Ankit can you also upload the video of assignment too ?
@user-sv6hh4gt4z
@user-sv6hh4gt4z 6 месяцев назад
Which one approach is considered optimized the join one or without join ?
@susmitadolas5178
@susmitadolas5178 2 года назад
Hi Ankit, I just first saw the question and tried to do it myself. After I was done and I came back to the video, even though the result was same the methods were different. I am not sure on how to validate my answer on huge data though. Can you please help me to know if my method lacks anything? WITH CTE AS ( SELECT ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY order_date ASC ) AS RN ,customer_id, order_date FROM customer_orders ) SELECT order_date ,SUM( CASE WHEN RN=1 THEN 1 else 0 END )AS NEW_COUNT ,SUM(CASE WHEN RN1 THEN 1 else 0 END ) AS REPEAT_COUNT FROM CTE GROUP BY order_date ORDER BY order_date Thanks in advance!
@ankitbansal6
@ankitbansal6 2 года назад
Looks good. Thanks for posting 👏
@anuragkumar-ti1vz
@anuragkumar-ti1vz Год назад
I have tried a bit different approach with counter as ( select *, count(customer_id) over(partition by customer_id order by order_date) as ct from customer_orders ) select order_date, sum(case when ct=1 then 1 else 0 end) as New_customer_counter, sum(case when ct!=1 then 1 else 0 end) as old_customer_counter, sum(case when ct=1 then order_amount else 0 end ) as New_customer_revenue, SUM(case when ct!=1 then order_amount else 0 end ) as Old_customer_revenue from counter
@mohammadabdullah9944
@mohammadabdullah9944 2 года назад
Thanks Ankit. Can you please share github link for code. That would be really helpful.
@HimanshuSharma-uk6td
@HimanshuSharma-uk6td Год назад
Hi Ankit, Please have a look on below answer using windows function. with ft as (select customer_id, order_date, Dense_rank() over(Partition by customer_id order by order_date) as R from customer_orders) select order_date,sum(new_customer) as new_customer, sum(existing_customer) as existing_customer from (select *, case when R > 1 then 1 else 0 end as existing_customer, case when R = 1 then 1 else 0 end as new_customer from ft) t1 group by order_date order by order_date;
@supriyakolate2575
@supriyakolate2575 Год назад
Hi Ankit, Nice job. I have a query - lets say like given scenario of new and repeat customer, if we do have few more scenarios like New, retained, Unretained, Reactivated and Lapsed customers. I/p table has millions of rows. Then, instead of self joining main table again and again, can we apply required filters and take data in CTE and then use that as a main table will help to optimize performance?
@ankitbansal6
@ankitbansal6 Год назад
Yes . If with the same filters you need to use table multiple times then its a good idea to create cte and use that. You can also explore option to create temp table and use that.
@supriyakolate2575
@supriyakolate2575 Год назад
@@ankitbansal6 i had to create a view so, was not had option to create temp table
@ashisanshuman8873
@ashisanshuman8873 11 месяцев назад
@@supriyakolate2575 Can you share the data for the possible scenario, if you have and approach to do it?
@bittusingh3729
@bittusingh3729 Год назад
Hi Ankit, thax for your informative video, i just started practicing sql with ur YT channel, I tried to add order_amount but i could not sumup the value of first_ and repeat_date. Here is my input below: select *from customer_orders; with first_visit as( select customer_id, min(order_date) as first_date, Order_amount from customer_orders group by customer_id), Order_amount as( select co.customer_id, co.order_date, case when co.order_date = fv.first_date then 1 else 0 end as First_time_customer, case when co.order_date != fv.first_date then 1 else 0 end as Repeated_customer from customer_orders as co join first_visit as fv on co.customer_id = fv.customer_id) select ca.customer_id, om.order_date, om.First_time_customer,om.Repeated_customer,ca.order_amount, case when om.First_time_customer = 1 then sum(ca.order_amount) else 0 end as firsttime_customer_order_amount, case when om.Repeated_customer = 1 then sum(ca.order_amount) else 0 end as Repeated_customer_order_amount from Order_amount as om join customer_orders as ca on ca.customer_id = om.customer_id group by ca.customer_id, ca.order_date order by ca.order_date;
@rrjishan
@rrjishan 5 месяцев назад
can i also use window function
@chinmaybhogaonkar9840
@chinmaybhogaonkar9840 2 года назад
Please make video on thumb rules that are must to be followed
@ankitbansal6
@ankitbansal6 2 года назад
Sure.
@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
@pradeepdjain
@pradeepdjain Год назад
Using rank /row number this can be done in a. More smaller and efficient query?
@ankitbansal6
@ankitbansal6 Год назад
Yes
@ankursingh5297
@ankursingh5297 6 месяцев назад
Hey Ankit what do you think about my approach for this question >>>>> with cte as( select *, row_number() over(partition by customer_id order by order_date ) as rank from customer_orders ) select order_date, sum(case when rank = 1 then 1 else 0 end) as new_cus, sum(case when rank = 1 then order_amount else 0 end) as new_cus_revenue, sum(case when rank != 1 then 1 else 0 end) as old_cus, sum(case when rank != 1 then order_amount else 0 end) as old_cus_revenue from cte group by order_date Please let me know if this is good enough
@gunpathtiwari9110
@gunpathtiwari9110 24 дня назад
if i want to know Repeat Customer vs New Customer Last year vs current year pls advise
@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.
@sandeepagarwal7155
@sandeepagarwal7155 7 месяцев назад
@ankit , Can you review my solution: with abc as (select customer_id,order_date, min(order_date) over(partition by customer_id) as first_purchase from customer_orders), new_cust as( select *, (case when order_date = first_purchase then 'new_customer' else 'old' end) as status from abc) select order_date,sum(case when status = 'new_customer' then 1 else 0 end) as new_cust, sum(case when status = 'old' then 1 else 0 end) as repeating_cust from new_cust group by 1