У меня 2 стола. В таблице А есть дата, ISBN (для книги), спрос (спрос на эту дату). Таблица B содержит дату, ISBN (для книги) и SalesRank.
Пример данных выглядит следующим образом: DailyBookFile содержит 150 тыс. записей для каждой даты, начиная с 2010 года (т. е. 150 тыс. * 365 дней * 8 лет). То же самое и с таблицей SalesRank, содержащей около 500 тысяч записей на каждую дату.
DailyBookFile
Date Isbn13 CurrentModifiedDemandTotal
20180122 9780955153075 13
20180122 9780805863567 9
20180122 9781138779396 1
20180122 9780029001516 9
20180122 9780470614150 42
SalesRank
importdate ISBN13 SalesRank
20180122 9780029001516 69499
20180122 9780470614150 52879
20180122 9780805863567 832429
20180122 9780955153075 44528
20180122 9781138779396 926435
Required Output
Date Avg_Rank Book_Group
20180122 385154 Elite
20180121 351545 Elite
20180120 201545 Elite
Я хочу получить Top 200 CurrentModifiedDemand за каждый день и взять средний рейтинг.
Я не могу найти решение, так как я новичок в SQL.
Я начал с того, что получил Top 200 CurrentModifiedDemand за вчерашний день и получил средний рейтинг за прошлый год.
SELECT DBF.Filedate AS [Date],
AVG(AMA.SalesRank) AS Avg_Rank,
'Elite' AS Book_Group
FROM [ODS].[wholesale].[DailyBookFile] AS DBF
INNER JOIN [ODS].[MarketplaceMonitor].[SalesRank] AS AMA ON (DBF.Isbn13 = AMA.ISBN13
AND DBF.FileDate = AMA.importdate)
WHERE DBF.Isbn13 IN (SELECT TOP 200 Isbn13
FROM [ODS].[wholesale].[DailyBookFile]
WHERE FileDate = 20180122
AND CAST(CurrentModifiedDemandTotal AS int) > 200)
AND DBF.Filedate > 20170101
GROUP BY DBF.Filedate;
Но результат не тот, что я хочу. Итак, теперь мне нужен ISBN для 200 лучших CurrentModifiedDemand на каждый день и их средний рейтинг. Я пробовал с этим.
DECLARE @i int;
SET @i = 20180122;
WHILE (SELECT DISTINCT(DBF.Filedate)
FROM [ODS].[wholesale].[DailyBookFile] AS DBF
WHERE DBF.Filedate = @i) IS NOT NULL
BEGIN
SELECT DBF.Filedate AS [Date],
AVG(AMA.SalesRank) AS Avg_Rank,
'Elite' AS Book_Group
FROM [ODS].[wholesale].[DailyBookFile] AS DBF
INNER JOIN [ODS].[MarketplaceMonitor].[SalesRank] as AMA ON DBF.Isbn13 = AMA.ISBN13
AND DBF.FileDate = AMA.importdate
WHERE DBF.Isbn13 in (SELECT TOP 200 Isbn13
FROM [ODS].[wholesale].[DailyBookFile]
WHERE FileDate = @i
AND CAST (CurrentModifiedDemandTotal AS int) > 500)
AND DBF.Filedate = @i
GROUP BY DBF.Filedate;
SET @i = @i+1;
END
В этом я получаю один результат запроса выбора в каждом окне. Есть ли способ получить результат в одной таблице?
P.S. Список 200 лучших книг каждый день будет меняться в соответствии с CurrentModifiedDemand. Я хочу взять их среднее значение. рейтинг продаж за этот день.
mysql
иsql-server
? Что вы используете? Кроме того, использование циклаWHILE
— плохая идея. Не могли бы вы опубликовать некоторые данные DDL, расходные образцы данных и ожидаемый результат? Вероятно, для этого будет гораздо лучший подход к набору данных. - person Larnu   schedule 23.01.2018'20180121'
и'20180120'
, однако для него нет образцов данных. Откуда берутся эти ценности? - person Larnu   schedule 23.01.2018