Wednesday, January 9, 2019

SQL question challenge (Companies)


Link to github

DDL Scripts
CREATE TABLE companies (
   member_id            int,
   company_name       varchar(80),
   year_start      int
  );

  INSERT INTO companies VALUES (1,'Google', 1990);
  INSERT INTO companies VALUES (1,'Microsoft', 2000);
  INSERT INTO companies VALUES (2,'Microsoft', 2000);
  INSERT INTO companies VALUES (2,'Google', 2001);
  INSERT INTO companies VALUES (3,'Microsoft', 1997);
  INSERT INTO companies VALUES (3,'Google', 1998);
  INSERT INTO companies VALUES (4,'Microsoft', 1997);
  INSERT INTO companies VALUES (4,'LinkedIn', 1998);
  INSERT INTO companies VALUES (4,'Google', 2000);
  +-----------+--------------+------------+
  | member_id | company_name | year_start |
  +-----------+--------------+------------+
  |         1 | Google       |       1990 |
  |         1 | Microsoft    |       2000 |
  |         2 | Microsoft    |       2000 |
  |         2 | Google       |       2001 |
  |         3 | Microsoft    |       1997 |
  |         3 | Google       |       1998 |
  |         4 | Microsoft    |       1997 |
  |         4 | LinkedIn     |       1998 |
  |         4 | Google       |       2000 |
  +-----------+--------------+------------+



QUESTIONS

1) COUNT MEMBERS WHO EVER MOVED FROM MICROSOFT TO GOOGLE
step 1
step 1
  select distinct(a.member_id) 
 from (select member_id,company_name,
      dense_rank() over (partition by member_id 
                                       order by year_start asc) as rnk 
  from companies ) a 
 join 
      (select member_id,company_name, dense_rank() 
                    over (partition by member_id order by year_start asc) as rnk 
     from companies) b 
 on a.member_id=b.member_id 
 where a.company_name='microsoft' and b.company_name='google' 
 +-----------+-----+--------------+-----------+-----+--------------+
 | member_id | rnk | company_name | member_id | rnk | company_name |
 +-----------+-----+--------------+-----------+-----+--------------+
 |         1 |   2 | Microsoft    |         1 |   1 | Google       |
 |         2 |   1 | Microsoft    |         2 |   2 | Google       |
 |         3 |   1 | Microsoft    |         3 |   2 | Google       |
 |         4 |   1 | Microsoft    |         4 |   3 | Google       |
 +-----------+-----+--------------+-----------+-----+--------------+
        step2 : specify the rank
 select distinct(a.member_id) 
  from (select member_id,company_name,
   dense_rank() over (partition by member_id 
                                           order by year_start asc) as rnk 
         from companies ) a 
  join 
        (select member_id,company_name, dense_rank() 
                           over (partition by member_id order by year_start asc) as rnk 
     from companies) b 
  on a.member_id=b.member_id 
  where a.company_name='microsoft' and b.company_name='google' 
   and a.rnk=1 and b.rnk >=2;
 +-----------+
 | member_id |
 +-----------+
 |         2 |
 |         3 |
 |         4 |
 +-----------+
  
  select a.member_id,a.company_name,b.company_name 
   from companies a, companies b 
    where a.member_id=b.member_id 
    and a.year_start < b.year_start 
    and a.company_name='microsoft' 
    and b.company_name='google';
 +-----------+--------------+--------------+
 | member_id | company_name | company_name |
 +-----------+--------------+--------------+
 |         2 | Microsoft    | Google       |
 |         3 | Microsoft    | Google       |
 |         4 | Microsoft    | Google       |
 +-----------+--------------+--------------+

2) COUNT MEMBERS WHO DIRECTLY MOVED
FROM MICROSOFT TO GOOGLE? (MICORSOFT --LINKEDIN -- GOOGLE DOESN'T COUNT)
select distinct(a.member_id) 
 from (select member_id,company_name,
  dense_rank() over (partition by member_id 
                                    order by year_start asc) as rnk 
     from companies ) a 
 join 
      (select member_id,company_name, dense_rank() over 
                (partition by member_id order by year_start asc) as rnk 
     from companies) b 
 on a.member_id=b.member_id 
 where a.company_name='microsoft' and b.company_name='google' 
 and a.rnk=1 and b.rnk =2;

No comments:

Post a Comment