自定义金额计算

2023-12-14

我有下表

Date      Value promo   item
01/01/2011  626 0   1230
01/02/2011  231 1   1230
01/03/2011  572 1   1230
01/04/2011  775 1   1230
01/05/2011  660 1   1230
01/06/2011  662 1   1230
01/07/2011  541 1   1230
01/08/2011  849 1   1230
01/09/2011  632 1   1230
01/10/2011  906 1   1230
01/11/2011  961 1   1230
01/12/2011  361 0   1230
01/01/2012  461 0   1230
01/02/2012  928 1   1230
01/03/2012  855 0   1230
01/04/2012  605 0   1230
01/05/2012  83  0   1230
01/06/2012  44  0   1230
01/07/2012  382 0   1230
01/08/2012  862 0   1230
01/09/2012  549 0   1230
01/10/2012  632 0   1230
01/11/2012  2   0   1230
01/12/2012  26  0   1230

我尝试计算平均总和 (SoldAt)/最小日期和最大日期之间的天数回滚前 28 行(4 周),其中 promo =1 by Article

无论当天折扣如何,平滑期均为 4 周。

也就是说,如果该商品在过去 4 周内促销了一周,则不考虑销售周的促销情况,平滑时间将超过 5 周。

如何计算 promo =1 的前 4 周/28 行数据按时间顺序?

I try

         CREATE TABLE #RollingTotalsExample
(
    [Date]     DATE 
    ,[Value]   INT
    ,promo float 
    ,item int 
);

INSERT INTO #RollingTotalsExample
SELECT '2011-01-01',626,1,1230
UNION ALL SELECT '2011-02-01',231,1,1230 UNION ALL SELECT '2011-03-01',572,1,1230
UNION ALL SELECT '2011-04-01',775,1,1230 UNION ALL SELECT '2011-05-01',660,1,1230
UNION ALL SELECT '2011-06-01',662,1,1230 UNION ALL SELECT '2011-07-01',541,1,1230
UNION ALL SELECT '2016-08-01',849,1,1230 UNION ALL SELECT '2016-09-01',632,1,1230
UNION ALL SELECT '2016-10-01',906,1,1230 UNION ALL SELECT '2016-11-01',961,1,1230
UNION ALL SELECT '2016-04-01',775,1,1230 UNION ALL SELECT '2016-05-01',660,1,1230
UNION ALL SELECT '2016-06-01',662,1,1230 UNION ALL SELECT '2016-07-01',541,1,1230
UNION ALL SELECT '2016-08-01',849,1,1230 UNION ALL SELECT '2016-09-01',632,1,1230
UNION ALL SELECT '2016-10-01',906,1,1230 UNION ALL SELECT '2016-11-01',961,1,1230
UNION ALL SELECT '2016-12-01',361,0,1230 UNION ALL SELECT '2012-01-01',461,0,1230
UNION ALL SELECT '2012-02-01',928,0,1230 UNION ALL SELECT '2012-03-01',855,0,1230
UNION ALL SELECT '2012-04-01',605,0,1230 UNION ALL SELECT '2012-05-01',83,0,1230
UNION ALL SELECT '2012-06-01',44,0,1230 UNION ALL SELECT '2012-07-01',382,0,1230
UNION ALL SELECT '2012-08-01',862,0,1230 UNION ALL SELECT '2012-09-01',549,0,1230
UNION ALL SELECT '2012-10-01',632,0,1230 UNION ALL SELECT '2012-11-01',2,0,1230
UNION ALL SELECT '2012-12-01',26,0,1230;
 SELECT * FROM #RollingTotalsExample;

    -- Rolling twelve month total by using INNER JOIN
    SELECT a.[Date]
        ,Value=MAX(CASE WHEN a.[Date] = b.[Date] THEN a.Value END)
        ,Rolling12Months=CASE
                            WHEN ROW_NUMBER() OVER (ORDER BY a.[Date]) < 12
                            THEN NULL
                            ELSE SUM(b.Value)
                            END
    FROM #RollingTotalsExample a
    JOIN #RollingTotalsExample b ON b.[Date] BETWEEN DATEADD(month, -11, a.[Date]) AND a.[Date]
    GROUP BY a.[Date]
    ORDER BY a.[Date];

现在如何修改查询以计算最小日期和最大日期之间的平均总和 (SoldAmt)/天数 回滚按时间排序的前 28 行数据,促销 =1 按文章


这是需要 SQL 2012 中提供的 LAG() 的替代方法,但请注意示例数据不包含每个日期之前的“2​​8 个不同天”。此外,所使用的实际数据类型未知(date/smalldatetime/datetime/datetime2),也不知道是否需要从日期截断时间。因此,有一些注意事项,此方法为 28 个不同日期创建了一系列日期范围(但如果数据未提供这些日期范围,则它们是 28 天)。这里是一个是一个sqlfiddle 演示

PostgreSQL 9.3 架构设置: (因为 SQL Server 不在 sqlfiddle 上运行)

CREATE TABLE Table1
    (theDate timestamp, Value int, promo int, item int)
;

INSERT INTO Table1
    (theDate, Value, promo, item)
VALUES
    ('2011-01-01 00:00:00', 626, 0, 1230),
    ('2011-01-02 00:00:00', 231, 1, 1230),
    ('2011-01-03 00:00:00', 572, 1, 1230),
    ('2011-01-04 00:00:00', 775, 1, 1230),
    ('2011-01-05 00:00:00', 660, 1, 1230),
    ('2011-01-06 00:00:00', 662, 1, 1230),
    ('2011-01-07 00:00:00', 541, 1, 1230),
    ('2011-01-08 00:00:00', 849, 1, 1230),
    ('2011-01-09 00:00:00', 632, 1, 1230),
    ('2011-01-10 00:00:00', 906, 1, 1230),
    ('2011-01-11 00:00:00', 961, 1, 1230),
    ('2011-01-12 00:00:00', 361, 0, 1230),
    ('2012-01-01 00:00:00', 461, 0, 1230),
    ('2012-01-02 00:00:00', 928, 1, 1230),
    ('2012-01-03 00:00:00', 855, 0, 1230),
    ('2012-01-04 00:00:00', 605, 0, 1230),
    ('2012-01-05 00:00:00', 83, 0, 1230),
    ('2012-01-06 00:00:00', 44, 0, 1230),
    ('2012-01-07 00:00:00', 382, 0, 1230),
    ('2012-01-08 00:00:00', 862, 0, 1230),
    ('2012-01-09 00:00:00', 549, 0, 1230),
    ('2012-01-10 00:00:00', 632, 0, 1230),
    ('2012-01-11 00:00:00', 2, 0, 1230),
    ('2012-01-12 00:00:00', 26, 0, 1230)
;

Query 1:

select
      t1.item
    , ranges.theStart
    , ranges.theEnd
    , sum(t1.value)
    , sum(t1.value) / 28 avg
from (
      select
            coalesce(lag(theDay,28) over(order by theDay) , theDay - INTERVAL '28 DAYS') as theStart
          , theDay as theEnd
      from (
            select distinct cast(thedate as date) theDay from Table1
            ) days
      ) ranges
inner join table1 t1 on theDate between ranges.theStart and ranges.theEnd
group by
      t1.item
    , ranges.theStart
    , ranges.theEnd

Results:

| item |                   thestart |                    theend |  sum | avg |
|------|----------------------------|---------------------------|------|-----|
| 1230 | December, 04 2010 00:00:00 | January, 01 2011 00:00:00 |  626 |  22 |
| 1230 | December, 05 2010 00:00:00 | January, 02 2011 00:00:00 |  857 |  30 |
| 1230 | December, 06 2010 00:00:00 | January, 03 2011 00:00:00 | 1429 |  51 |
| 1230 | December, 07 2010 00:00:00 | January, 04 2011 00:00:00 | 2204 |  78 |
| 1230 | December, 08 2010 00:00:00 | January, 05 2011 00:00:00 | 2864 | 102 |
| 1230 | December, 09 2010 00:00:00 | January, 06 2011 00:00:00 | 3526 | 125 |
| 1230 | December, 10 2010 00:00:00 | January, 07 2011 00:00:00 | 4067 | 145 |
| 1230 | December, 11 2010 00:00:00 | January, 08 2011 00:00:00 | 4916 | 175 |
| 1230 | December, 12 2010 00:00:00 | January, 09 2011 00:00:00 | 5548 | 198 |
| 1230 | December, 13 2010 00:00:00 | January, 10 2011 00:00:00 | 6454 | 230 |
| 1230 | December, 14 2010 00:00:00 | January, 11 2011 00:00:00 | 7415 | 264 |
| 1230 | December, 15 2010 00:00:00 | January, 12 2011 00:00:00 | 7776 | 277 |
| 1230 | December, 04 2011 00:00:00 | January, 01 2012 00:00:00 |  461 |  16 |
| 1230 | December, 05 2011 00:00:00 | January, 02 2012 00:00:00 | 1389 |  49 |
| 1230 | December, 06 2011 00:00:00 | January, 03 2012 00:00:00 | 2244 |  80 |
| 1230 | December, 07 2011 00:00:00 | January, 04 2012 00:00:00 | 2849 | 101 |
| 1230 | December, 08 2011 00:00:00 | January, 05 2012 00:00:00 | 2932 | 104 |
| 1230 | December, 09 2011 00:00:00 | January, 06 2012 00:00:00 | 2976 | 106 |
| 1230 | December, 10 2011 00:00:00 | January, 07 2012 00:00:00 | 3358 | 119 |
| 1230 | December, 11 2011 00:00:00 | January, 08 2012 00:00:00 | 4220 | 150 |
| 1230 | December, 12 2011 00:00:00 | January, 09 2012 00:00:00 | 4769 | 170 |
| 1230 | December, 13 2011 00:00:00 | January, 10 2012 00:00:00 | 5401 | 192 |
| 1230 | December, 14 2011 00:00:00 | January, 11 2012 00:00:00 | 5403 | 192 |
| 1230 | December, 15 2011 00:00:00 | January, 12 2012 00:00:00 | 5429 | 193 |

注意:对于 SQL Server

  • 代替theDay - INTERVAL '28 DAYS' use dateadd(天,-28,theDay)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自定义金额计算 的相关文章

  • pymssql 库中的参数绑定是否正确实现?

    我使用 pymsqsql 库从 Python 程序调用极其简单的查询 with self conn cursor as cursor cursor execute select extra id from mytable where id
  • Microsoft SQL:CASE WHEN 与 ISNULL/NULLIF

    除了可读性之外 在防止 SQL 中的除以 0 错误时 使用 CASE WHEN 语句与 ISNULL NULLIF 相比还有什么显着的好处吗 CASE WHEN BeginningQuantity BAdjustedQuantity 0 T
  • 无法与重定向器建立连接。确保“sql browser”服务正在运行

    所以我尝试这个 sql server 2012 由于这个错误我无法打开任何 ssis 包 无法与重定向器建立连接 确保 sql browser 服务正在运行 我的 Sql 浏览器肯定正在运行 我尝试在本地服务 本地系统和网络下更改它 仍然没
  • 向带有检查约束 SQL 的表添加列

    我想向表中添加一列 然后添加一个检查约束以确保其大于 0 我似乎无法让它在 oracle sl Developer 中运行 Alter TABLE store101 add column Base salary Number 7 2 con
  • 从 MS Access 调用存储过程会导致错误 3146

    当我使用下面所示的代码从 MS Access 前端调用 SQL Server 存储过程时 它停止运行并抛出运行时错误 3146 这个存储过程在 SQL Server 中工作正常 但是当我从 MS Access 运行时 它首先工作 但突然停止
  • 针对约 225 万行的单表选择查询的优化技术?

    我有一个在 InnoDB 引擎上运行的 MySQL 表 名为squares大约有 2 250 000 行 表结构如下 squares square id int 7 unsigned NOT NULL ref coord lat doubl
  • 使用用户定义函数 MySql 时出错

    您好 请帮我解决这个问题 提前致谢 我在数据库中定义了这些函数 CREATE FUNCTION levenshtein s1 VARCHAR 255 s2 VARCHAR 255 RETURNS INT DETERMINISTIC BEGI
  • SQL Server 实例名称的最大长度?

    我需要知道以下版本的 SQL Server 实例名称的最大字符长度 如果它们之间存在差异 SQL Server 2000 SQL Server 2005 SQL Server 2008 SQL Server 2008 R2 我正在开发一个应
  • 通过 ASP.NET 网站管理员工具获得 Asp.Net 会员资格

    我使用 aspnet regsql 创建了一个数据库 该数据库是在 sql server 2008 中创建的 而不是在我的项目中的数据文件夹中创建的 我需要手动将其移动到该文件夹 吗 接下来 在网站管理工具中 我转到提供商部分并单击 测试
  • 当附加触发器时,Linq-to-sql 插入和更新失败

    我最近在 linq to sql 方面遇到了一些问题 问题在于 当我们将触发器附加到事件时 它 认为 插入和更新失败 一个例子可以是一行 当一行被更改时 附加一个触发器将 LastUpdated 冒号设置为当前时间 这将导致 linq to
  • 消息 203,级别 16,状态 2,不是有效标识符

    我收到以下错误 消息 203 级别 16 状态 2 过程 getQuestion 第 18 行名称 select top 1 from tlb Question inner join tlb options on tlb options q
  • 如何对 SQL 进行多次查询

    我正在尝试创建一个表 并在 PHP 脚本的帮助下在数据库中插入一些值 虽然只插入 1 行 但效果很好 当我尝试输入更多行数时 出现错误 我需要为每个查询编写完整的插入语句 因为我正在使用在线 Excel 到 SQL 查询转换器
  • SQL-Server:备份集保存现有数据库以外的数据库的备份

    我正在尝试恢复数据库的 SQL Server 备份文件 但它抛出如下错误 备份集保存除现有数据库之外的数据库的备份 我的数据库是SQL Server 2008 备份文件是2005年的 可能是什么问题 我也遇到过这个问题 解决方案 不要创建空
  • 随着时间的推移累积(不重叠)——技术?

    我正在尝试找到一种更好的方法来制作水晶报告 其他人的 按组添加不重叠的时间 这显然是一个古老的问题 有没有一种技术可以得到 调整每条记录的 开始 结束 时间 以消除共同 重叠时间 亚组内 使用直接 SQL 尽管我发现我可以执行 CTE 假设
  • 如何使用 MySQL 选择有特定值的 2 个连续行?

    我正在构建一个系统 该系统应该显示学生何时连续缺席两天 例如 此表包含缺勤情况 day id missed 2016 10 6 1 true 2016 10 6 2 true 2016 10 6 3 false 2016 10 7 1 tr
  • 使用 DISTINCT 进行查询需要很长时间

    我正在使用 Microsoft Access 2003 我的项目中的一个表单需要很长时间才能向用户显示 这是适用的查询 SELECT DISTINCT tb KonzeptDaten DFCC tb KonzeptDaten OBD Cod
  • 无法将数据加载到 mvc 4 中的 jTable 中

    好的 我第一次尝试 jTable 我可以加载表 但这对我没有什么好处 因为它不会加载我的任何数据 当我调试程序时 我想要的表中的所有行都存储在我的列表中 因此我很困惑为什么当我运行应用程序时会弹出一个对话框 显示 与服务器通信时发生错误 H
  • 从表中选择行,其中另一个表中具有相同 id 的行在另一列中具有特定值

    在 MySQL 中 如果我们有两个表 comments key value 1 foo 2 bar 3 foobar 4 barfoo and meta comment key value 1 1 2 1 3 2 4 1 我想得到来自以下人
  • 如何在 SQL Server 2012 中选择除一列之外的所有列? [复制]

    这个问题在这里已经有答案了 有没有一种方法可以选择所有列 但只选择我不想选择的特定列 我的意思是有时我会遇到这样的问题 表有数百个字段 而我只需要删除一个字段 我需要重写所有列吗 有什么窍门吗 喜欢select
  • TransactionScope 是否需要开启 DTC 服务?

    根据我的阅读 为了在 NET 中使用 TransactionScope 您需要运行 Windows 中的分布式事务协调器服务 我有那个服务关掉 并且我的应用程序似乎运行相同并且回滚事务没有问题 我错过了什么吗 它如何能够发挥作用呢 我正在运

随机推荐

  • 删除第二个冒号后的文本

    我需要删除第二个冒号之后的所有内容 我有几种日期格式 需要使用相同的算法进行清理 a lt 2016 12 31T18 31 34Z b lt 2016 12 31T18 31Z 我尝试匹配两个列组 但我似乎无法找出如何删除第二个匹配组 s
  • Python简单数字比较

    问题 计算机随机生成一个数字 用户输入一个数字 计算机会告诉你是否太高或太低 然后你将继续猜测 直到猜出数字为止 我的解决方案 import random computer random randint 1 500 def guessNum
  • Robotium:请安装兼容的 Android API 级别(15 或更高)

    尝试运行新的 Robotium 测试时出现此错误 有谁知道如何修理它 我拥有所需的所有 API 15 以及许多更高的 API 我缺少什么 这是我的 gradle 文件的一部分 android compileSdkVersion 25 bui
  • 将查询合并为一个

    我有以下疑问 Query 1 SELECT so ClientID All Channels as CustomerGroup so StatementID so Brand so Product Sum so Amount Amount
  • WaitHandle.WaitAny 匹配 WaitForMultipleObjects 功能

    我正在移植C API代码到 NET并研究函数调用WaitHandle WaitAny作为替代品WaitForMultipleObjects但是当调试时 NET4我可以看到这个函数被挂接到 private static extern int
  • 仅需要实体 ID 时如何避免初始化 Hibernate 代理

    For a ManyToOneJPA 实体中的关系 我只对实际的 id 引用感兴趣 而不是获取与该关系关联的整个模型 以这些 Kotlin JPA 实体为例 Entity class Continent Id var id String v
  • React 动态设置状态属性及其值[重复]

    这个问题在这里已经有答案了 我有以下组件 import React Component from react import Action from action jsx import SingleGridEl from singleGrid
  • RecyclerView 在使用 FirebaseRecyclerAdapter 首次启动时不会加载数据

    我在用着FirebaseRecyclerAdapter填充一个RecyclerView in a Fragment 这是我的代码 mDatabase FirebaseDatabase getInstance getReference myA
  • iText 在 sandbox.stamper.SuperImpose.java 中设置创建日期和修改日期

    我正在尝试在中设置创建日期和修改日期将一个 PDF 的内容叠加到另一个 PDF 中例如 sandbox stamper SuperImpose java 原则 我认为 很明确 use getInfo 然后做 info put PdfName
  • Facebook Like 按钮有时出现有时不出现

    我的网站上的类似按钮有奇怪的问题 当我进入页面时它会正确显示 刷新后它不会出现并且我有 javascript 错误 FB provide is not a function Break on this error FB provide Ar
  • 并排对齐多个表格

    以下代码生成 2 个相互叠加的表 我将如何设置它以使它们并排对齐 例如连续3个 title sample output pdf document r global options R options knitr opts chunk set
  • 将 varchar 数据类型转换为 datetime 数据类型导致值超出范围

    我有以下从 C Windows 服务运行的内联 SQL UPDATE table name SET status cd 2 sdate CAST 03 28 2011 18 03 40 AS DATETIME bat id 33acff9b
  • JPA实体:从Oracle DATE列获取小时、分钟和秒

    我无法从 Oracle 数据库获取完整的日期信息 dd mm yyyy hh mm ss 在数据库级别 在我想要接收的列中设置测试值 update my table set my date column to date 2011 06 15
  • 异步套接字

    如何与多个客户端连接 与多个客户端连接后 我如何从每个客户端接收单独的数据 据我所知 我需要使用名为 Asyncore 的东西 我该如何实施 客户类别 import socket class Client def init self sel
  • Python / Kivy 应用程序仅运行一次

    我正在使用 Anaconda 平台的 Spyder IDE 运行一个非常简单的 python 3 5 脚本 from kivy app import App from kivy uix label import Label from kiv
  • 如何在 Idris 中表达范围有效性?

    我正在尝试在 Idris 中构建一个简单的调查表单 目前正在努力验证用户输入 该输入以字符串形式出现 所提出问题的类型 目前我有以下几种类型 data Question Type where QCM numOptions Nat gt qu
  • HSM解密+加密链接

    我的应用程序充当交换机 在两方之间传输非常敏感的消息 我试图弄清楚如何在不 查看 他们试图发送的消息的情况下做到这一点 我有一个 HSM 并且我已经为发送者生成了一个密钥对 他们将使用我提供给他们的公钥来加密消息 而我可以使用 HSM 中的
  • 目标C中的^是什么意思? [复制]

    这个问题在这里已经有答案了 Objective C 中的 字符是什么意思 就像下面的代码一样 TWTweetComposeViewControllerCompletionHandler completionHandler TWTweetCo
  • 将制表符分隔的 .txt 解析为 Pandas DataFrame

    我有一个制表符分隔的 txt 文件 我正在尝试将其导入到与文本文件格式相同的 Python 数据框中 如下所示 ham TAB一直走到裕廊点 太疯狂了 只在布吉斯大世界有自助餐 电影那里有更多的东西 spam TAB免费参加 2 场每周比赛
  • 自定义金额计算

    我有下表 Date Value promo item 01 01 2011 626 0 1230 01 02 2011 231 1 1230 01 03 2011 572 1 1230 01 04 2011 775 1 1230 01 05