Как создать запрос, который рассчитывает рекламное преимущество вычисляемого столбца - PullRequest
1 голос
/ 19 октября 2019

Мне нужно создать запрос, который показывает среднюю производительность для редакторов, которые работали над более чем одной книгой, за исключением их первой опубликованной книги с точностью до 0,01 страниц в день.

У меня проблемынайти способ получить количество дней с последнего столбца DateOfPublication и использовать его, чтобы отделить его от столбца NoOfPages.

Отображаемые столбцы:

EditorName

BookName

вычисляемый столбец AverageProductivity

Вот таблицы и их столбцы

AGENT  AgentID (PK,varchar(11), not null)
       AgentName (varchar(25), not null)

BOOK   BookName (PK, varchar(45), not null)
       Genre (varchar(25), not null)
       DateOfPublication (date, not null)
       NoOfPages (int, not null)
       WriterID (PK, FK,, varchar(11), not null)
       EditorID (FK, varchar(11), not null)

EDITOR EditorID (PK, varchar(11), not null)
       EditorName (varchar(25), not null)
       Mentors_EditorID (FK, varchar(11), null)

WRITER WriterID (PK, varchar(11), not null)
       WriterName (varchar(25), not null)
       AgentID (FK, varchar(11), not null)

Пример данных

insert into BOOK (BookName, WriterID, Genre, DateOfPublication, NoOfPages, EditorID)
values ('Valley of Heroes','10','Fiction','2010-01-12',874,'20');
insert into BOOK (BookName, WriterID, Genre, DateOfPublication, NoOfPages, EditorID)
values ('The Ruler''s Return','11','Fantasy','2012-03-14',765,'22');
insert into BOOK (BookName, WriterID, Genre, DateOfPublication, NoOfPages, EditorID)
values ('eRobot','11','Fantasy','2011-04-15',264,'20');
insert into BOOK (BookName, WriterID, Genre, DateOfPublication, NoOfPages, EditorID)
values ('An Uncle''s Letters','12','Fiction','2012-06-12',258,'20');
insert into BOOK (BookName, WriterID, Genre, DateOfPublication, NoOfPages, EditorID)
values ('Pretty flowers','13','Album','2013-01-31',148,'22');
insert into BOOK (BookName, WriterID, Genre, DateOfPublication, NoOfPages, EditorID)
values ('A Tale of Lions','12','Fantasy','2012-08-17',301,'21');
insert into BOOK (BookName, WriterID, Genre, DateOfPublication, NoOfPages, EditorID)
values ('eRobot','13','Sci Fi','2012-10-04',465,'23');

Запрос теперь производит правильные столбцы, кредит GMB, но вычисленный столбец показывает 0 значений.

Вот запрос ...

select * from (
    select 
    e.EditorName,
    b.BookName,
    round(
        NoOfPages/datediff(
            day, 
            lag(b.DateOfPublication) over(partition by b.EditorID order by b.DateOfPublication),
            DateOfPublication
        ),
        2
    ) AverageProductivity       
from book b
inner join editor e on e.EditorID = b.EditorID 
) x where AverageProductivity is not null

Results .. .

Melanie eRobot  0
Melanie An Uncle's Letters  0
George  Pretty flowers  0

1 Ответ

1 голос
/ 19 октября 2019

Вы можете использовать оконную функцию lag(), чтобы восстановить дату предыдущей публикации того же редактора.

Тогда datediff(day, ...) может дать вам разницу между датой публикации последней книги и текущей в днях.

Наконец, разделите количество страниц в текущей книге на разницу в днях, используйте round(), чтобы ограничить количество десятичных знаков, и все готово.

Для первой книгиредактор, lag() возвращает null, который будет распространяться в вычислениях, в результате чего вычисляемый столбец также показывает null.

select 
    e.EditorName,
    b.BookName,
    round(
        NoOfPages/datediff(
            day, 
            lag(b.DateOfPublication) over(partition by b.EditorID order by b.DateOfPublication),
            DateOfPublication
        ),
        2
    ) AverageProductivity       
from book b
inner join editor e on e.EditorID = b.EditorID 

Если вы хотите пропустить записи, соответствующие первомуКнига каждого редактора, то вы можете обернуть запрос:

select * from (
    -- above query
) x where AverageProductivity is not null
...