【发布时间】:2014-02-01 22:05:06
【问题描述】:
我有两张桌子:
CREATE TABLE Vendors (
VendorID : INTEGER PRIMARY KEY,
AVG_Dialy_Sale : REAL NOT NULL,
...
);
CREATE TABLE SoldStuff (
Vendor references VENDORS,
Date_Sold Date NOT NULL,
StuffID INTEGER PRIMARY KEY
);
第一个包含有关供应商的一般数据 - 他们的 ID 是什么,他们每天的销售额以及其他一些值。 第二个表包含有关已售产品的信息:谁、什么和什么时候售出的东西。每条线代表不同的一种产品。这些产品是独一无二的,只能出售一次。
问题:如何更新表VENDORS,使其包含供应商每天销售的平均产品数量?
我尝试过这样:
-制作表WHO | HOW_MANY,其中包含“有多少商品已售出此供应商”而不是ID,但值分散在许多行中 - 我们必须使用SUM 来获得所需的值。
-我制作了一张表WHO | FIRST_DAY,其中包含每个供应商销售商品的第一天。
-下一步将加入这些表,并将SUM(HOW_MANY) / (NOW() - FIRST_DAY + 1) GROUP BY VENDOR 放入表VENDORS,但此时我被卡住了。
这是给出表WHO | FIRST_ITEM_SOLD_DATE | HOW_MANY_ITEMS_SOLD的SQL语句:
WITH CoolTable AS (
SELECT DATE_TRUNC('day', DateSold) AS Date__,
COUNT(StuffID) AS HowManyItemsSold,
Vendor
FROM SoldStuff
GROUP BY Vendor, DATE_TRUNC('day', Vendor.DateSold)
),
FirstDates AS (
SELECT Vendor,
MIN(Date__) AS FirstItemSoldDate
FROM CoolTable
GROUP BY Vendor
)
SELECT CoolTable.Vendor,
FirstItemSoldDate
FROM CoolTable JOIN FirstDates ON CoolTable.Vendor = FirstDates.Vendor;
注意:它在同一供应商的每一行中给出相同的日期,但要获得每个供应商销售的所有产品的总和,必须执行SELECT COUNT(*) FROM TableIAmStuckOn GROUP BY Vendor;。
count(distinct date_sold) 不能“那样”使用 - 如果一个人两年前只售出 5 件商品,他的 AVG_DIALY_SALE 应该比一周前开始销售并售出 2 件商品的人差得多。
我正在使用 PostgreSQL。
【问题讨论】:
-
我强烈建议不要更新供应商,而是创建一个跟踪平均销售额的物化视图(内置 9.3 功能或使用触发器维护)。
create table vendor_averages(vendor_id integer, sales_average bigint)。尝试将自动生成的数据分开。就此而言,您不妨从普通视图开始,看看它是否表现得足够好。
标签: sql postgresql average