【问题标题】:Average dialy activity - SQL平均每日活动 - SQL
【发布时间】: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


【解决方案1】:

相关的子查询怎么样:

update vendors
    set avg_daily_sale = (select count(*) * 1.0 / count(distinct date_sold)
                          from stuffsold ss
                          where ss.vendorId = vendors.vendorId
                         );

子查询是在没有子查询的情况下计算平均值的另一种方法。

编辑:

哦,如果您想获得“销售率”,那么

update vendors
    set avg_daily_sale = (select count(*) * 1.0 / (date(CURRENT_DATE) - min(date(date_sold)))
                          from stuffsold ss
                          where ss.vendorId = vendors.vendorId
                         );

【讨论】:

  • 重点是,count(distinct date_sold) 可能不会被使用——如果一个人两年前只卖出了 5 件商品,那么他的 AVG_DIALY_SALE 应该比一周前开始销售并卖出 2 件的人差得多项目。已在帖子中更新。
  • 你忘记了GROUP BY,它说“date_ 列必须出现在GROUP BY 子句中或用于聚合函数”,这就是我不知道该怎么做的地方做以及如何解决它。
  • @user2420535 。 . .我没有忘记group by,我忘记了min()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-24
相关资源
最近更新 更多