Amazon Interview | SQL Interview Problem asked during Amazon Interview

Поділитися
Вставка
  • Опубліковано 28 вер 2024
  • In this video, let us solve an SQL Problem asked during the Amazon Interview.
    OdinSchool: hubs.la/Q02CX94v0
    Download the scripts used in the video:
    techtfq.com/bl...
    Thanks for watching!

КОМЕНТАРІ • 115

  • @techTFQ
    @techTFQ  3 місяці тому +4

    Check out the upcoming Data Science bootcamp on OdinSchool: hubs.la/Q02CX94v0

    • @tinkalpatel7032
      @tinkalpatel7032 3 місяці тому

      In this bootcamp you're gonna give training or it will be done by someone else?

    • @coldfirekp5059
      @coldfirekp5059 Місяць тому

      Hi , can you show one query for reverse from date ranges to single dates

  • @saralavasudevan5167
    @saralavasudevan5167 2 місяці тому +2

    Thanks for the problem and explaination!. This was my solve:
    with mycte as
    (
    SELECT *,
    rank() over(partition by employee, status order by dates) as rn,
    datepart(day, dates) as theday,
    (datepart(day, dates) -rank() over(partition by employee, status order by dates)) as diff
    from emp_attendance
    )
    select employee, from_date, to_date, status
    from
    (
    select employee, diff, status, min(dates) as from_date, max(dates) as to_date
    from mycte
    group by employee, diff, status
    ) as x
    order by 1,2,3

    • @TonnyPodiyan
      @TonnyPodiyan 2 місяці тому

      Nice one 👍👍

    • @hopess-nm4ij
      @hopess-nm4ij Місяць тому

      Can anyone say I am fresher will I facethis type of complex queries in interview I mean is this query for freshers or experienced persons

  • @Lekhatopil
    @Lekhatopil 3 місяці тому +23

    My solution in PostgreSQL:
    WITH CTE AS
    (SELECT *
    , dates - (ROW_NUMBER() OVER(PARTITION BY employee, status ORDER BY dates)::INT) AS grp
    FROM emp_attendance)
    SELECT employee, MIN(dates) AS from_date
    , MAX(dates) AS end_date, status
    FROM CTE
    GROUP BY employee, grp, status
    ORDER BY employee, from_date
    In my ROW_NUMBER function, I have partitioned by employee and status, and ordered by dates. For each employee, the data is grouped by status and ordered by dates. The row number resets to 1 whenever the status changes (from present to absent or vice-versa) within each employee's partition.
    I then subtracted the row number from the date to create a group identifier (grp) to identify consecutive dates within the same status for each employee.

    • @yasmeenkarachiwala9612
      @yasmeenkarachiwala9612 2 місяці тому

      how does this work -
      dates - (ROW_NUMBER() OVER(PARTITION BY employee, status ORDER BY dates)::INT)
      could you please explain with an example

    • @abhiraj6494
      @abhiraj6494 2 місяці тому

      Good

    • @anshulmehta5732
      @anshulmehta5732 Місяць тому +1

      i did it same as you did but this solution would not work if month/year changes in the same group.

    • @Lekhatopil
      @Lekhatopil Місяць тому

      @@anshulmehta5732
      When considering scenarios where the month or year changes within the same group, additional partitioning by month and year becomes necessary for the solution to work correctly.
      To verify this, I included entries from Jan 29th to Feb 3rd with the status "Present" and modified the query using --- ROW_NUMBER() OVER(PARTITION BY employee, status, EXTRACT(MONTH FROM dates) ORDER BY dates)::INT
      This approach created two distinct records: one from January 29th to 31st and another from February 1st to 3rd.
      Similarly, we can achieve the same result for years by partitioning based on EXTRACT(YEAR FROM dates).
      Full Query:
      WITH CTE AS (
      SELECT *
      , dates - ROW_NUMBER() OVER(PARTITION BY employee, status, EXTRACT(MONTH FROM dates) ORDER BY dates)::INT AS grp
      FROM emp_attendance
      )
      SELECT employee
      , MIN(dates) AS from_date, MAX(dates) AS end_date, status
      FROM CTE
      GROUP BY employee, grp, status
      ORDER BY 1, 2

    • @Lekhatopil
      @Lekhatopil Місяць тому

      @@anshulmehta5732 When considering scenarios where the month or year changes within the same group, additional partitioning by month and year becomes necessary for the solution to work correctly.
      To verify this, I included additional entries from Jan 29th to Feb 3rd with the status "Present" and modified the query using -- ROW_NUMBER() OVER(PARTITION BY employee, status, EXTRACT(MONTH FROM dates) ORDER BY dates)::INT
      This approach created two distinct records: one from January 29th to 31st and another from February 1st to 3rd.
      Similarly, we can achieve the same result for years by partitioning based on EXTRACT(YEAR FROM dates).
      Full Query:
      WITH CTE AS (
      SELECT *
      , dates - ROW_NUMBER() OVER(PARTITION BY employee, status, EXTRACT(MONTH FROM dates) ORDER BY dates)::INT AS grp
      FROM emp_attendance
      )
      SELECT employee
      , MIN(dates) AS from_date, MAX(dates) AS end_date, status
      FROM CTE
      GROUP BY employee, grp, status
      ORDER BY 1, 2

  • @satishkumar-rp7zb
    @satishkumar-rp7zb 3 місяці тому +1

    solving challenging queries from top mnc with nice explanation, great thoufiq keep it up.

  • @KoushikT
    @KoushikT 2 місяці тому

    with A as (select
    *,
    row_number() over (partition by employee,status order by dates) as rnk
    from emp_attendance
    ),
    B as (
    select
    *,
    dates - CONCAT(rnk::text, ' day')::interval as diff
    from A
    )
    select
    employee,
    min(dates) as start_date,
    max(dates) as end_date,
    max(status)
    from
    B
    group by employee,diff
    order by 1,2

  • @sirajuddinmohamedsaleem937
    @sirajuddinmohamedsaleem937 3 місяці тому +3

    @TFQ can we use min and max instead of first_value and last_value in the window function?

  • @andriimoskovskykh5044
    @andriimoskovskykh5044 3 місяці тому

    You can achieve the same differentiation between employees based on status by simply using rank() and partitioning it by employee, status (as in the first cte).
    WITH rank_cte AS (
    SELECT
    *,
    rank() OVER(partition by employee, status order by dates) as r
    FROM emp_attendance
    ORDER BY employee, dates
    ),
    consec_cte AS (
    SELECT
    *,
    r - row_number() OVER() AS consec
    FROM rank_cte
    )
    SELECT
    employee,
    MIN(dates) AS start_date,
    MAX(dates) AS end_date,
    status
    FROM consec_cte
    GROUP BY employee, status, consec
    ORDER BY employee, start_date;

  • @prasadreddy9754
    @prasadreddy9754 3 місяці тому +3

    have a question for you @techTFQ , how much time u have taken to come up for this solution ? just curious to know an approximate time

  • @mihirit7137
    @mihirit7137 3 місяці тому +2

    this one is a very tough question, for what level role was this question asked 😰

    • @mihirit7137
      @mihirit7137 3 місяці тому +3

      very hard to think about this question and finish in 30 mins

  • @shaikhanuman8012
    @shaikhanuman8012 3 місяці тому +1

    Tqs For giving Valueble Infomation.

  • @Durgada_l
    @Durgada_l 2 місяці тому

    select max(amount) as thirdhighamount from orders where amount

  • @lakshmanlee3579
    @lakshmanlee3579 2 місяці тому

    my solution
    with cte as(SELECT *
    ,rank() over (partition by employee,status order by dates asc) rnk
    from emp_attendance
    order by employee,dates),
    cte2 as (
    select *,(extract(day from dates) - rnk) diff
    from cte)
    select employee,min(dates) from_date,max(dates) to_date,status
    from cte2
    group by employee,status,diff

  • @monasanthosh9208
    @monasanthosh9208 3 місяці тому

    MYSQL Solution
    Select employee,Min(Dates) as From_date,Max(Dates) as End_Date,Status from
    (Select *,subdate(Dates,interval Row_Number() over
    (Partition by Employee,Status Order by dates) Day) as Seg from
    Emp_Attendance)N group by employee,Seg order by Employee, Dates;

  • @SanthoshKumar-dr7gy
    @SanthoshKumar-dr7gy 2 місяці тому

    Cte will work in Oracle db ??? Pls confirm???

  • @raghavendrabeesa7334
    @raghavendrabeesa7334 3 місяці тому

    Hi Taufiq ,Please confirm my solution is how optimal?
    with cte as(
    SELECT *,lead(status,1,null) over(partition by employee order by dates) as next_day,min(dates) over(partition by employee) as start_day FROM emp_attendance)
    select employee,date_add(LAG(DATES,1,DATE_SUB(START_DAY,1)) OVER(PARTITION BY EMPLOYEE order by dates),1) AS FROM_DATE, dates as TO_DATE,status from cte where status!=next_day or next_day is null;

  • @prakash5935
    @prakash5935 3 місяці тому +3

    Where we can find the dataset?

    • @VishalYadav-bj4ls
      @VishalYadav-bj4ls 3 місяці тому

      In the description box click on script link and download that script you’ll get all queries

  • @PaulMorrison-m2c
    @PaulMorrison-m2c 8 днів тому

    Lewis Anthony Perez Patricia Brown Thomas

  • @RobtSteele-c3p
    @RobtSteele-c3p 27 днів тому

    Harris Elizabeth Garcia Sandra Wilson George

  • @rajatpathak5944
    @rajatpathak5944 3 місяці тому

    with cte as (select *,
    Date - INTERVAL '1' DAY * (row_number() over(partition by Employee, Status order by Date asc)) as rnk
    from EMP_ATD)
    select
    Employee,
    min(Date),
    max(Date),
    Status
    from cte
    group by Employee, rnk, Status
    order by Employee, min(date);

  • @boppanakishankanna6029
    @boppanakishankanna6029 2 місяці тому

    My solution in ms SQL server:
    SELECT employee,from_date,to_date,Status
    FROM(SELECT grp,employee,MIN(dates) AS from_date,MAX(dates) AS to_date,min(status) AS Status
    FROM(
    SELECT ROW_NUMBER() OVER(PARTITION BY employee ORDER BY dates) -ROW_NUMBER() OVER(PARTITION BY employee,status ORDER BY dates) AS grp,*
    FROM emp_attendance)a
    GROUP BY grp,employee)b
    ORDER BY employee,from_date;

  • @Alexpudow
    @Alexpudow 3 місяці тому

    MS SQL approach
    with a as (
    SELECT *, ROW_NUMBER() over(partition by employee order by dates) rn
    from emp_attendance)
    ,b as (
    select *,rn - ROW_NUMBER() over(partition by employee order by dates) rn2
    from a
    where status like 'PRESENT')
    ,c as (
    select *,rn - ROW_NUMBER() over(partition by employee order by dates) rn2
    from a
    where status not like 'PRESENT')
    select employee, status, min(dates) from_date, max(dates) to_date
    from b
    group by rn2, employee, status
    union
    select employee, status, min(dates) from_date, max(dates) to_date
    from c
    group by rn2, employee, status
    order by 1, 3

  • @DeniseMiller-b3m
    @DeniseMiller-b3m 26 днів тому

    Allen Betty Moore Brenda Moore David

  • @RoseWilson-u2t
    @RoseWilson-u2t Місяць тому

    Harris Maria Clark Jason Moore Ronald

  • @DavidHaland
    @DavidHaland 23 дні тому

    Brown Cynthia Wilson Michael Robinson Donna

  • @YzkavPzlangd-t6v
    @YzkavPzlangd-t6v 29 днів тому

    Hall Ronald Moore Robert Robinson Robert

  • @Tech_with_Srini
    @Tech_with_Srini 2 місяці тому +5

    Bro Odin school is not a good option, i wasted my time and money , They wont provide you placements , I joined in 2022 , still i am not get a job through it, pls dont waste ur time and money

  • @StephenSanchez-p7h
    @StephenSanchez-p7h 10 днів тому

    Anderson Thomas Garcia Michelle Taylor Mary

  • @Damon-007
    @Damon-007 3 місяці тому +5

    My solution:
    WITH cte AS (
    SELECT *,
    CASE WHEN status = LAG(status, 1, status) OVER (PARTITION BY employee ORDER BY dates) THEN 0 ELSE 1 END AS flag
    FROM emp_attendance
    ),
    cte2 AS (
    SELECT employee, dates, status, SUM(flag) OVER (PARTITION BY employee ORDER BY dates) AS flag_sum
    FROM cte
    )
    SELECT employee, MIN(dates) AS from_date, MAX(dates) AS to_date, MAX(status) AS status
    FROM cte2
    GROUP BY employee, flag_sum
    ORDER BY employee, from_date;
    Sir, Is there will be any difference i use iif inplace of case Statment???

  • @martinberger365
    @martinberger365 3 місяці тому +1

    Isn't this approach more straight forward?
    WITH grouped_attendance AS (
    SELECT
    employee,
    dates,
    status,
    DATE_SUB(dates, INTERVAL ROW_NUMBER() OVER (PARTITION BY employee, status ORDER BY dates) DAY) AS group_date
    FROM emp_attendance
    )
    SELECT
    employee,
    MIN(dates) AS from_date,
    MAX(dates) AS to_date,
    status
    FROM grouped_attendance
    GROUP BY employee, status, group_date
    ORDER BY employee, from_date;
    I guess you are always overcomplicating things don't know why!

  • @sathyamoorthy2362
    @sathyamoorthy2362 2 місяці тому +2

    with first as (
    select *,lag(status,1) over(partition by employee order by dates) as prev_status
    from emp_attendance
    ),
    second as (
    select b.* from (
    select *,case when status = prev_status then 'SAME' else 'CHANGE' end as status_check from first
    ) b
    where b.status_check='CHANGE'
    ),
    final as (
    select employee ,dates as from_date ,lead(dates,1) over(partition by employee order by dates)-1 as to_date,status
    from second )
    select employee,from_date,coalesce(to_date,from_date),status from final
    order by employee,from_date;

  • @dasoumya
    @dasoumya 3 місяці тому +6

    Hi thoufiq! Here is my simple solution using SQL server:
    with cte1 as(select employee, dates, dateadd(day,-1*(row_number()over(partition by employee,status order by dates)),dates) as date_grp,status
    from employee)
    select employee,min(dates) as from_date,max(dates) as to_date, status
    from cte1
    group by employee,date_grp,status
    order by employee,from_date;

    • @mahivamsi9598
      @mahivamsi9598 3 місяці тому +2

      can you explain below part 😅😅
      dateadd(day,-1*(row_number()over(partition by employee,status order by dates)),dates) as date_grp

    • @anirbanbiswas7624
      @anirbanbiswas7624 3 місяці тому

      @@mahivamsi9598 -1*(row_number()over(partition by employee,status order by dates) this value will give positive value so he decided to multiply with -1 so that it gets negative value so that difference can be created

    • @k.saibhargav8072
      @k.saibhargav8072 Місяць тому

      super

  • @shubharthibhattacharyya9191
    @shubharthibhattacharyya9191 3 місяці тому +2

    Can you please start a Snowflake Bootcamp ? Will be really helpful.

  • @mdmarufnawaz
    @mdmarufnawaz 28 днів тому

    WITH cte AS (
    SELECT *, CASE WHEN status != prev_status THEN 1 ELSE 0 END AS flag FROM (
    SELECT *, LAG(status,1,status) OVER (PARTITION BY employee ORDER BY dates) AS prev_status
    from emp_attendance) t),
    cte2 AS (SELECT *, SUM(flag) OVER (PARTITION BY employee ORDER BY dates) AS grp_flag
    FROM cte)
    SELECT employee, MIN(dates) AS from_date, MAX(dates) AS to_date, MAX(status) AS status_co
    FROM cte2
    GROUP BY employee, grp_flag
    ORDER BY employee

  • @sunnygoud5133
    @sunnygoud5133 3 місяці тому +1

    Hi comments box here is my solution:
    with cte as(
    SELECT *,dense_rank()over( partition by employee order by employee,dates) as rn,
    dense_rank() over(partition by employee,status order by employee,dates ) as rn2 from emp_attendance),
    cte1 as(
    select employee,dates,status,rn-rn2 as fn from cte
    order by dates)
    select distinct employee,first_value(dates) over(partition by employee,fn order by dates )as from_date,last_value(dates) over(partition by employee,fn) as to_date,status from cte1
    order by employee,from_da

  • @grzegorzko55
    @grzegorzko55 3 місяці тому +1

    WITH cte AS(
    SELECT
    EMPLOYEE
    ,DATES
    ,STATUS
    ,rownum - SUM(CASE WHEN STATUS = 'PRESENT' THEN 1 ELSE 1 END) OVER(PARTITION BY EMPLOYEE, STATUS ORDER BY DATES) AS test
    from emp_attendance
    --where EMPLOYEE = 'A1'
    ORDER BY EMPLOYEE, DATES
    ),SUMMARY AS(
    SELECT
    EMPLOYEE
    ,status
    ,test
    ,MIN(DATES) AS FROM_DATE
    ,MAX(DATES) AS TO_DATE
    FROM cte
    GROUP BY EMPLOYEE ,status,test
    ORDER BY FROM_DATE
    )
    SELECT
    EMPLOYEE
    ,FROM_DATE
    ,TO_DATE
    ,status
    FROM summary
    ORDER BY EMPLOYEE ,FROM_DATE;

  • @shivinmehta7368
    @shivinmehta7368 2 місяці тому

    Postgres solution
    with base as
    (
    select *,ROW_NUMBER() over(PARTITION by employee order by dates asc ) as rn
    from emp_attendance
    )
    SELECT employee,from_date,to_date,status
    from
    (
    select employee ,status, diff,Min(dates) as from_date,max(dates) as to_date
    from
    (
    select *,count(status) over(partition by employee , status order by employee asc, dates asc rows BETWEEN unbounded PRECEDING and CURRENT ROW) as cumulative_count,
    abs(rn-count(status) over(partition by employee , status order by employee asc, dates asc rows BETWEEN unbounded PRECEDING and CURRENT ROW)) as diff
    from base
    )
    group by 1,2,3
    )
    order by 1,2,3

  • @savannahdowman5991
    @savannahdowman5991 6 годин тому

    Hernandez Mary Martinez Angela Thomas Scott

  • @chiragbangera1833
    @chiragbangera1833 3 місяці тому

    with cte as(
    SELECT
    *,
    ROW_NUMBER()OVER(PARTITION BY employee, status ORDER BY dates, status) - ROW_NUMBER()OVER(PARTITION BY employee ORDER BY dates, status) as rnk1
    FROM attendance
    ORDER BY 1,2
    )
    SELECT
    employee,
    min(dates) as from_date,
    max(dates) as to_date,
    status
    FROM cte
    GROUP BY employee,status ,rnk1
    ORDER BY 1, 2

  • @florincopaci6821
    @florincopaci6821 3 місяці тому +1

    Hello my solution in Sql Server:
    WITH FLO AS (
    SELECT *, CASE WHEN STATUS LAG(STATUS,1,'OPOUI')OVER(PARTITION BY EMPLOYEE ORDER BY DATES)THEN 1 ELSE 0 END
    AS FLAG
    FROM EMP_ATTENDANCE
    ), FLO1 AS (
    SELECT * , SUM(FLAG)OVER(PARTITION BY EMPLOYEE ORDER BY DATES)AS GRP
    FROM FLO
    )
    SELECT EMPLOYEE, MIN(DATES)AS FROM_DATE, MAX(DATES)AS TO_DATE, STATUS
    FROM FLO1
    GROUP BY EMPLOYEE, STATUS,GRP
    ORDER BY EMPLOYEE, FROM_DATE
    Hope it helps.

  • @manojdevareddy8831
    @manojdevareddy8831 3 місяці тому +2

    CTEs and window functions are new to me in learning stage, but I got this very clearly thanks for the in detail explanation

  • @hopess-nm4ij
    @hopess-nm4ij Місяць тому

    Can anyone say I am fresher will I facethis type of complex queries in interview I mean is this query for freshers or experienced persons

  • @balaroxx2700
    @balaroxx2700 2 місяці тому +1

    this is the corrected data set
    (the data set in description not included A2)
    drop table if exists emp_attendance;
    create table emp_attendance
    (
    employee varchar(10),
    dates date,
    status varchar(20)
    );
    insert into emp_attendance values('A1', '2024-01-01', 'PRESENT');
    insert into emp_attendance values('A1', '2024-01-02', 'PRESENT');
    insert into emp_attendance values('A1', '2024-01-03', 'PRESENT');
    insert into emp_attendance values('A1', '2024-01-04', 'ABSENT');
    insert into emp_attendance values('A1', '2024-01-05', 'PRESENT');
    insert into emp_attendance values('A1', '2024-01-06', 'PRESENT');
    insert into emp_attendance values('A1', '2024-01-07', 'ABSENT');
    insert into emp_attendance values('A1', '2024-01-08', 'ABSENT');
    insert into emp_attendance values('A1', '2024-01-09', 'ABSENT');
    insert into emp_attendance values('A1', '2024-01-10', 'PRESENT');
    insert into emp_attendance values('A2', '2024-01-06', 'PRESENT');
    insert into emp_attendance values('A2', '2024-01-07', 'PRESENT');
    insert into emp_attendance values('A2', '2024-01-08', 'ABSENT');
    insert into emp_attendance values('A2', '2024-01-09', 'PRESENT');
    insert into emp_attendance values('A2', '2024-01-10', 'ABSENT');
    SELECT * from emp_attendance;

  • @DarwinElliot
    @DarwinElliot 23 дні тому

    Wilson Jeffrey Garcia Deborah Young Anthony

  • @pauleedavidson9251
    @pauleedavidson9251 23 дні тому

    Thomas Mark Hernandez Gary Lopez William

  • @victorslawman9778
    @victorslawman9778 11 днів тому

    Young Donald Lewis Scott Garcia Larry

  • @AriesTeresa-i6n
    @AriesTeresa-i6n 27 днів тому

    Rodriguez Steven Hernandez Sharon Moore Patricia

  • @amanbhattarai3273
    @amanbhattarai3273 3 місяці тому +1

    How difficult sql queries are to write on real job senario? Intermediate or hard ?

  • @NicholasAguilar-s5o
    @NicholasAguilar-s5o 16 днів тому

    Lopez Robert Garcia Scott Walker Sharon

  • @AnikaSharma-s3f
    @AnikaSharma-s3f 26 днів тому

    Martinez Patricia Hall Paul Robinson Jose

  • @shivaprasad-kn3kw
    @shivaprasad-kn3kw 2 місяці тому

    Solution in SQL Server
    with CTE as (
    select employee, dates, status, ROW_NUMBER() over(partition by employee, status order by dates)
    as rn from emp_attendance), CTE2 as (
    select employee, dates, status, DATEDIFF(day, rn, dates) as rn2 from CTE)
    select employee, min(dates) as mindate, max(dates) as maxdates, status
    from CTE2 group by employee, status, rn2 order by employee, mindate

  • @SAURABHKUMAR-ot3sl
    @SAURABHKUMAR-ot3sl 3 місяці тому +1

    Sir may we solve this problem using lag() window function?

  • @KingsleyHulda
    @KingsleyHulda 7 днів тому

    Young Anna Hernandez John Miller Jason

  • @adityatomar9820
    @adityatomar9820 3 місяці тому +2

    Man you are legend....great explanation 😮

  • @SylviaFerguson-u8g
    @SylviaFerguson-u8g Місяць тому

    Harris Steven Jones Kimberly Hall Mark

  • @DonaldRichardson-j5e
    @DonaldRichardson-j5e 19 днів тому

    Clark Angela Brown Kevin Young Barbara

  • @EdnaWilliams-x3l
    @EdnaWilliams-x3l 27 днів тому

    Clark Gary Hall Robert White Elizabeth

  • @LoiseHarry-u7q
    @LoiseHarry-u7q 22 дні тому

    Rodriguez Margaret Clark Margaret Brown Carol

  • @JeamesCrystal-m3x
    @JeamesCrystal-m3x 25 днів тому

    Jones Larry Thomas Helen Moore Sharon

  • @likinponnanna8990
    @likinponnanna8990 2 місяці тому

    My solution in postgresql
    WITH EMP_ID AS (
    SELECT ROW_NUMBER() OVER (PARTITION BY EMPLOYEE ORDER BY EMPLOYEE,DATES) AS EMP_ID,*
    FROM PRACTISE."emp_attendance"),
    FLAG AS (
    SELECT *,
    ROW_NUMBER() OVER (PARTITION BY EMPLOYEE,STATUS ORDER BY EMPLOYEE,DATES) AS RN,
    EMP_ID - ROW_NUMBER() OVER (PARTITION BY EMPLOYEE,STATUS ORDER BY EMPLOYEE,DATES) FLAG
    FROM EMP_ID ORDER BY EMPLOYEE,EMP_ID,STATUS)
    SELECT EMPLOYEE,MIN(DATES) AS FROM_DATE,MAX(DATES) AS TO_DATE,MIN(STATUS) AS STATUS FROM FLAG
    GROUP BY EMPLOYEE,FLAG
    ORDER BY EMPLOYEE,FROM_DATE

  • @KimberlyMyers-s3f
    @KimberlyMyers-s3f Місяць тому

    Martin Matthew Brown Mark Hernandez Karen

  • @arjundev4908
    @arjundev4908 2 місяці тому

    with cte as(SELECT *,
    lag(status,1,status)over(partition by employee order by dates) as nxt
    from emp_attendance),v1 as(
    select *,
    sum(case when status = nxt then 0 else 1 end)over(partition by employee order by dates) as grp
    from cte)
    select employee,min(dates) as from_date,
    max(dates) as to_date,status
    from v1
    group by employee, grp,status;

  • @akanshasaxena1138
    @akanshasaxena1138 3 місяці тому +1

    Perfect Explanation, Thanks!

  • @rohithr9122
    @rohithr9122 3 місяці тому

    with cte as(
    select employee,dates,status,DAY(dates)-ROW_NUMBER()OVER(PARTITION BY employee order by dates)rn1
    from emp_attendance
    where status = 'PRESENT'),
    cte2 as(
    select employee,dates,status,DAY(dates)- ROW_NUMBER()over(partition by employee order by dates)rn2
    from emp_attendance
    where status = 'ABSENT')
    select employee,MIN(dates)as FROM_DATE,MAX(dates)TO_DATE,MAX(status)as status from cte
    group by employee, rn1
    UNION ALL
    select employee,MIN(dates),MAX(dates),MAX(status) from cte2
    group by employee,rn2
    ORDER BY employee,FROM_DATE,TO_DATE

  • @sreerag__27
    @sreerag__27 3 місяці тому +4

    create table emp_attendance(employee varchar(200), Dates date, status varchar(200));
    Insert into emp_attendance values
    ('A1','2024-01-01','PRESENT'),
    ('A1','2024-01-02','PRESENT'),
    ('A1','2024-01-03','PRESENT'),
    ('A1','2024-01-04','ABSENT'),
    ('A1','2024-01-05','PRESENT'),
    ('A1','2024-01-06','PRESENT'),
    ('A1','2024-01-07','ABSENT'),
    ('A1','2024-01-08','ABSENT'),
    ('A1','2024-01-09','ABSENT'),
    ('A1','2024-01-10','PRESENT'),
    ('A2','2024-01-06','PRESENT'),
    ('A2','2024-01-07','PRESENT'),
    ('A2','2024-01-08','ABSENT'),
    ('A2','2024-01-09','PRESENT'),
    ('A2','2024-01-10','ABSENT');
    select * from emp_attendance;

  • @Pathan264-f7q
    @Pathan264-f7q Місяць тому

    Sir Website link not working?

  • @alishahindia
    @alishahindia 3 місяці тому

    Someone can pls solve this infosys interview question,
    Text1 3
    Text2 5
    Text3 4
    Output should be
    Text1
    Text1
    Text1
    Text2
    Text2
    Text2
    Text2
    Text2
    Text3
    Text3
    Text3
    Text3
    Query should be single line query.

  • @SASC-ot2dm
    @SASC-ot2dm 3 місяці тому +2

    Thank you TFQ

  • @varunas9784
    @varunas9784 3 місяці тому

    Here's my take on it via MS SQL server for given dataset
    =================================================
    with cte as (select *,
    day(dates) - row_number() over (partition by status, employee order by dates) grp
    from emp_attendance)
    select employee, MIN(dates) as from_date, MAX(dates) to_date, status
    from cte
    group by grp, employee, status
    order by employee, from_date
    =================================================

  • @gopideveloper4375
    @gopideveloper4375 3 місяці тому +1

    This is very usefull information Bro!

  • @CebuProvince
    @CebuProvince 3 місяці тому

    nice to see u again, bro the last Line of your given Data is a little 0 too much
    insert into emp_attendance values('A2', '2024-01-010', 'ABSENT');
    the source is alsmost the same
    with cte as
    (select *, row_number() over(partition by employee order by employee, dates) as rn
    from emp_attendance),
    cte_present as
    (select *, row_number() over(partition by employee order by employee, dates) AS RN2
    , rn - row_number() over(partition by employee order by employee, dates) as flag
    from cte where status='PRESENT'),
    cte_absent as
    (select *, row_number() over(partition by employee order by employee, dates) as rn3
    , rn - row_number() over(partition by employee order by employee, dates) as flag
    from cte where status='ABSENT' )
    select employee
    , first_value(dates) over(partition by employee, flag order by employee, dates) as from_date
    , last_value(dates) over(partition by employee, flag order by employee, dates
    range between unbounded preceding and unbounded following) as to_date
    , status
    from cte_present
    union
    select employee
    , first_value(dates) over(partition by employee, flag order by employee, dates) as from_date
    , last_value(dates) over(partition by employee, flag order by employee, dates
    range between unbounded preceding and unbounded following) as to_date
    , status
    from cte_absent
    order by employee, from_date
    with specification rn2, rn3 in MS SQL Server

  • @manianbarasu2289
    @manianbarasu2289 Місяць тому

    Sir, Your videos are really awesome. can you make videos for python programming

  • @AmanRaj-p8w
    @AmanRaj-p8w 3 місяці тому

    MySql solution: with cte as (
    select *, row_number() over (partition by employee, status order by dates ) as rw,
    dates - row_number() over (partition by employee order by employee) as diff from emp_attendance
    order by employee, dates
    )
    select employee, min(dates) as from_date, max(dates) as to_date, status from cte
    group by employee, status, diff

  • @jayakrishnachanumuru
    @jayakrishnachanumuru Місяць тому

    🙏

  • @ladhkay
    @ladhkay 2 місяці тому +1

    Nicely explained!

  • @krishnaarepalli5118
    @krishnaarepalli5118 3 місяці тому

    If you have any time gap
    Please make a video about
    Frequently asking interview questions in sql for Capgemini interview...

  • @MahidharYouTube
    @MahidharYouTube Місяць тому

    Your videos helped me a lot in cracking my data analyst interview brother, thank you so much

  • @keerthis125
    @keerthis125 2 місяці тому

    Sir plz do one vd for jr data analyst interview questions and ans like pdf

  • @rakeshdebntah4738
    @rakeshdebntah4738 3 місяці тому +1

    I really appreciate .

  • @fathimafarahna2633
    @fathimafarahna2633 3 місяці тому +1

    As always 👍

  • @kummithavenkatareddy2302
    @kummithavenkatareddy2302 2 місяці тому

    Thank you very much clear explanation for the solution

  • @andynelson2340
    @andynelson2340 3 місяці тому

    I struggled with this. The rn - rn where status = X is a cool pattern.

  • @prakash5935
    @prakash5935 3 місяці тому

    Share some tips to get into a product based company

  • @imanelamnaoir590
    @imanelamnaoir590 2 місяці тому

    can we expect a question like this for an entry level business analyst ?

    • @austintaylor7743
      @austintaylor7743 11 днів тому

      My exact thoughts! I have an interview coming up and if Im asked this I will just laugh and tell them to have a good week.

  • @ishanshubham8355
    @ishanshubham8355 3 місяці тому +2

    I have tried to solve this in MYSQL.
    with cte as (
    select *,row_number() over(partition by employee order by dates) as rn,
    row_number() over(partition by employee,status order by dates) as rn1
    from emp_attendance
    )
    select employee,min(dates) as from_date,max(dates) as to_date,status
    from cte
    group by employee,rn-rn1,status
    order by 1,2

  • @abhinavkumar2662
    @abhinavkumar2662 3 місяці тому +2

    Sir but there should be a query related to MSSQL,because there are people who are using MSSQL only.Need a Practice session on MSSQL

    • @balaroxx2700
      @balaroxx2700 2 місяці тому +1

      Copy this query and paste that in chat get type like alter this code to work in mssql

  • @Mathematica1729
    @Mathematica1729 3 місяці тому

    Solution Given by claude 3.5 Sonnet:
    WITH grouped_attendance AS (
    SELECT
    *,
    DATE_SUB(date, INTERVAL ROW_NUMBER() OVER (PARTITION BY employee, status ORDER BY date) DAY) AS group_date
    FROM employee_attendance
    )
    SELECT
    employee,
    MIN(date) AS FROM_DATE,
    MAX(date) AS TO_DATE,
    status
    FROM grouped_attendance
    GROUP BY employee, status, group_date
    ORDER BY employee, FROM_DATE;