【发布时间】:2018-07-02 12:39:00
【问题描述】:
我有 2 张桌子。表 A 有日期、ISBN(书籍)、需求(该日期的需求)。表 B 包含日期、ISBN(用于图书)和 SalesRank。
样本数据如下: DailyBookFile 每个日期都有 150k 条记录,从 2010 年开始(即 150k * 365 天 * 8 年)行。 SalesRank 表也是如此,每个日期大约有 50 万条记录
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 新手,因此无法找到解决方案。
我从昨天获得了前 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;
但结果不是我想要的。所以,现在我想要每天前 200 名 CurrentModifiedDemand 的 ISBN 及其平均排名。我试过了。
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
在此我在每个窗口中获得一个选择查询结果。有没有办法将结果放在一个表中?
附:每天前 200 本书的列表会根据 CurrentModifiedDemand 变化。我想拿他们的平均值。当天的销售排名。
【问题讨论】:
-
您在此处标记了
mysql和sql-server?你用的是哪个?此外,使用WHILE循环是个坏主意。您能否发布一些 DDL、可消耗样本数据和预期输出?为此可能会有更好的数据集方法。 -
这个问题是针对 mysql 还是针对 sql-server 的?他们都是不同的
-
无论 DBMS 是什么,都不要害怕使用一些空白并格式化您的查询。这比它需要的要难读得多。
-
很抱歉,我正在使用 sql-server。我会尝试重新措辞。
-
在您的预期输出中,您有日期
'20180121'和'20180120'的值,但是,没有它的示例数据。这些价值观从何而来?
标签: sql-server while-loop with-statement