Запрос для извлечения отдельных строк с требованиями ниже - PullRequest
0 голосов
/ 22 января 2019

Пример даты в таблице:

+--------+---------+---------+--------------+-----------+------------+---+
| School |  Class  | Student | Student desc | Section   |    Date    |   |
+--------+---------+---------+--------------+-----------+------------+---+
| ABC    | Grade 2 | Stud 1  | AAA          | Mango     | 5/12/2015  | 1 |
| DEF    | Grade 2 | Stud 1  | AAA          | Mango     | 12/25/2018 |   |
| DEF    | Grade 2 | Stud 1  | AAA          | Orange    | 9/8/2016   |   |
| GHI    | Grade 3 | Stud 2  | BBB          | Apple     | 12/28/2016 | 2 |
| JKL    | Grade 3 | Stud 2  | BBB          | Pear      | 12/19/2016 |   |
| ABC    | Grade 2 | Stud 3  | CCC          | Guava     | 12/28/2016 | 3 |
| GHI    | Grade 3 | Stud 4  | DDD          | StarFruit | 9/8/2018   | 4 |
+--------+---------+---------+--------------+-----------+------------+---+

В идеале, для отображения нужно, чтобы 1 ученик был назначен только на один раздел в классе.

Мне нужно создать запрос для извлеченияданные, соответствующие нижеследующему требованию: -

  1. Независимо от школы необходимо показать отличительные данные для тех учеников, которым назначено несколько секций в одном классе.
+--------+---------+---------+--------------+----------+------------+
| School |  Class  | Student | Student desc | Section  |    Date    |
+--------+---------+---------+--------------+----------+------------+
| DEF    | Grade 2 | Stud 1  | AAA          | Mango    | 12/25/2018 |
| DEF    | Grade 2 | Stud 1  | AAA          | Orange   | 9/8/2016   |
| GHI    | Grade 3 | Stud 2  | BBB          | Apple    | 12/28/2016 |
| JKL    | Grade 3 | Stud 2  | BBB          | Pear     | 12/19/2016 |
+--------+---------+---------+--------------+----------+------------+

Ниже приведен запрос, который предоставляет правильные данные , если информация о школе выбрана :

select  distinct a.class
                    ,a.student
                    ,a.Stud desc
                    ,a.section
                    ,to_date(max(a.date),'MM-DD-YYYY')"Date"
      from         Table1 a,
    (   select  class
               ,student
               ,count(distinct section) cot       
          from Table1 c 
         where 1=1
           and class is not null
           and incoming_qty >= 1
      group by class
              ,student
        Having count(distinct section) > 1   
      ) b
     where   1=1
     and     a.class = b.class
     and     a.student=b.student
     and     b.cot > 1
     and     b.class is not null
     and     a.incoming_qty_new >= 1
     group by a.class,a.student,a.Stud desc,a.section
     order by  a.class,a.student,a.Stud desc,a.section;

Но запрос не работает в соответствии с ожиданиями при попытке получить школудеталь.

Пожалуйста, предложите.

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Вот пример использования аналитических функций для ваших данных. Попробуйте расширить его для вашего конкретного случая.

WITH t(School, Class, Student, StudentDesc, SectionName, Dates) AS
  (
    SELECT 'ABC','Grade 2','Stud 1','AAA','Mango',date'2015-05-12' FROM dual UNION ALL
    SELECT 'DEF','Grade 2','Stud 1','AAA','Mango',date'2018-12-25' FROM dual UNION ALL
    SELECT 'DEF','Grade 2','Stud 1','AAA','Orange',date'2016-09-08' FROM dual UNION ALL
    SELECT 'GHI','Grade 3','Stud 2','BBB','Apple',date'2016-12-28' FROM dual UNION ALL
    SELECT 'JKL','Grade 3','Stud 2','BBB','Pear',date'2016-12-19' FROM dual UNION ALL
    SELECT 'ABC','Grade 2','Stud 3','CCC','Guava',date'2016-12-28' FROM dual UNION ALL
    SELECT 'GHI','Grade 3','Stud 4','DDD','StarFruit',date'2018-09-08' FROM dual
  )

SELECT *
FROM (
      SELECT t.*,
             COUNT(DISTINCT SectionName) OVER (PARTITION BY Class, Student) AS cntStudentSections,
             ROW_NUMBER() OVER (PARTITION BY Class, Student ORDER BY Dates) AS StudentRowNumber
      FROM t 
     ) 
WHERE cntStudentSections > 1 AND StudentRowNumber = 1;
0 голосов
/ 22 января 2019

Вы можете использовать аналитические функции:

select t1.*
from (select t1.*,
             count(*) over (partition by class, student, section) as cnt
      from table1 t1
     ) t1
where cnt >= 2;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...