AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题

问题[running-totals](dba)

Martin Hope
PakLui
Asked: 2021-06-03 00:20:43 +0800 CST

解析函数:对上一列的累积求和

  • 0

使用分析函数,我希望列“总和”包含上一列的累积值。

但是我的代码得到了所有遭遇的总和。

这是用于测试的表格和数据:

CREATE TABLE users (
  user_id INT PRIMARY KEY,
  name CHARACTER VARYING(50)
);

CREATE TABLE orders_catalog (
    order_code INT PRIMARY KEY,
    order_desc CHARACTER VARYING(50) NOT NULL,
    cost REAL NOT NULL
);

CREATE TABLE encounter (
    encounter_id INT PRIMARY KEY,
    user_id INT NOT NULL,
    encounter_type CHARACTER VARYING(50) NOT NULL,

    CONSTRAINT FK_encounter FOREIGN KEY (user_id) REFERENCES users(user_id)
);

CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    order_code INT NOT NULL,
    encounter_id INT NOT NULL,
    created_dt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,

    CONSTRAINT FK_orders_catalog FOREIGN KEY (order_code) REFERENCES orders_catalog (order_code),
    CONSTRAINT FK_orders_encounter FOREIGN KEY (encounter_id) REFERENCES encounter(encounter_id)
);
--

INSERT INTO users(user_id, name) VALUES(1, 'Peter');
INSERT INTO users(user_id, name) VALUES(2, 'Charles');
INSERT INTO users(user_id, name) VALUES(3, 'Eva') ;
INSERT INTO users(user_id, name) VALUES(4, 'John');
INSERT INTO users(user_id, name) VALUES(5, 'Helene');

INSERT INTO orders_catalog(order_code, order_desc, cost) VALUES (10000, 'Painting', 100.34);
INSERT INTO orders_catalog(order_code, order_desc, cost) VALUES (10001, 'Painting', 214.11);
INSERT INTO orders_catalog(order_code, order_desc, cost) VALUES (10002, 'Painting', 214.11);
INSERT INTO orders_catalog(order_code, order_desc, cost) VALUES (10003, 'Spare part', 181.03);
INSERT INTO orders_catalog(order_code, order_desc, cost) VALUES (10004, 'Sheet metal', 168.18);
INSERT INTO orders_catalog(order_code, order_desc, cost) VALUES (10005, 'Sheet metal', 240.02);
INSERT INTO orders_catalog(order_code, order_desc, cost) VALUES (10006, 'Sheet metal', 240.02);
INSERT INTO orders_catalog(order_code, order_desc, cost) VALUES (10007, 'Electricity', 146.85);
INSERT INTO orders_catalog(order_code, order_desc, cost) VALUES (10008, 'Spare part', 162.13);
INSERT INTO orders_catalog(order_code, order_desc, cost) VALUES (10009, 'Electricity', 140.02);
INSERT INTO orders_catalog(order_code, order_desc, cost) VALUES (10010, 'Electricity', 180.02);

INSERT INTO encounter(encounter_id, user_id, encounter_type) VALUES(100,1,'appointment');
INSERT INTO encounter(encounter_id, user_id, encounter_type) VALUES(101,2,'appointment');
INSERT INTO encounter(encounter_id, user_id, encounter_type) VALUES(102,3,'appointment');
INSERT INTO encounter(encounter_id, user_id, encounter_type) VALUES(103,4,'urgent');
INSERT INTO encounter(encounter_id, user_id, encounter_type) VALUES(104,5,'urgent');
INSERT INTO encounter(encounter_id, user_id, encounter_type) VALUES(105,1,'appointment');
INSERT INTO encounter(encounter_id, user_id, encounter_type) VALUES(106,2,'appointment');
INSERT INTO encounter(encounter_id, user_id, encounter_type) VALUES(107,3,'waiting');
INSERT INTO encounter(encounter_id, user_id, encounter_type) VALUES(108,4,'urgent');
INSERT INTO encounter(encounter_id, user_id, encounter_type) VALUES(109,5,'waiting');
INSERT INTO encounter(encounter_id, user_id, encounter_type) VALUES(110,1,'waiting');

INSERT INTO orders(order_id, order_code, encounter_id, created_dt) VALUES (1000,10000,100,'2009-06-16 09:12');
INSERT INTO orders(order_id, order_code, encounter_id, created_dt) VALUES (1001,10001,101,'2009-06-16 09:12');
INSERT INTO orders(order_id, order_code, encounter_id, created_dt) VALUES (1002,10002,102,'2009-06-16 09:12');
INSERT INTO orders(order_id, order_code, encounter_id, created_dt) VALUES (1003,10003,103,'2009-12-03 09:50');
INSERT INTO orders(order_id, order_code, encounter_id, created_dt) VALUES (1004,10004,104,'2010-02-24 12:21');
INSERT INTO orders(order_id, order_code, encounter_id, created_dt) VALUES (1005,10005,105,'2010-03-27 23:54');
INSERT INTO orders(order_id, order_code, encounter_id, created_dt) VALUES (1006,10006,106,'2010-03-22 12:43');
INSERT INTO orders(order_id, order_code, encounter_id, created_dt) VALUES (1007,10007,107,'2010-02-24 12:21');
INSERT INTO orders(order_id, order_code, encounter_id, created_dt) VALUES (1008,10008,108,'2010-03-04 08:55');
INSERT INTO orders(order_id, order_code, encounter_id, created_dt) VALUES (1009,10009,109,'2010-03-06 09:25');
INSERT INTO orders(order_id, order_code, encounter_id, created_dt) VALUES (1010,10010,110,'2010-03-22 11:18');

这是我尝试过的查询:

SELECT
  u.user_id,
  name,
  ROW_NUMBER() OVER (
    PARTITION BY u.user_id ORDER BY o.created_dt ASC
  ) AS position,
  SUM (c.cost) OVER (
    PARTITION BY o.encounter_id
  ) AS cost,
  SUM (cost) OVER (
    PARTITION BY u.user_id
  ) AS sum
FROM
  users u
INNER JOIN
  encounter e USING (user_id)
INNER JOIN
  orders o USING (encounter_id)
INNER JOIN
  orders_catalog c USING (order_code)
ORDER BY name, position;

但输出不是我所期望的:

用户身份 姓名 位置 成本 和
2 查尔斯 1 214.11 454.13
2 查尔斯 2 240.02 454.13
3 伊娃 1 214.11 360.96002
3 伊娃 2 146.85 360.96002
5 海伦 1 168.18 308.2
5 海伦 2 140.02 308.2
4 约翰 1 181.03 343.16
4 约翰 2 162.13 343.16
1 彼得 1 100.34 520.38
1 彼得 2 180.02 520.38
1 彼得 3 240.02 520.38

因为我想要类似的东西:

用户身份 姓名 位置 成本 和
... ... ... ... ...
1 彼得 1 100.34 100.34
1 彼得 2 180.02 280.36
1 彼得 3 240.02 520.38

小提琴

postgresql running-totals
  • 1 个回答
  • 45 Views
Martin Hope
Dave
Asked: 2021-01-11 12:01:12 +0800 CST

如何显示以前记录的运行总计?

  • 1

我想知道是否有人可以帮忙。

我有以下代码,它基本上将 10 条记录插入到一​​个表中。从这张表中,我试图显示针对卖家的销售总额。我尝试过使用 LAG 功能,但这似乎不起作用。

这是代码。


CREATE TABLE Sales 
(
    OrderId Int NOT NULL,
    Seller  varchar(10) NULL,
    Amount  money NULL
)

INSERT INTO Sales VALUES
    (1, 'Alex', 10.00),
    (2, 'Sarah', 15.00),
    (3, 'Tracy', 10.25),
    (4, 'Pete', 10.25),
    (5, 'Tracy', 11.00),
    (6, 'Tracy', 10.25),
    (7, 'Alex', 10.25),
    (8, 'Jane', 10.25),
    (9, 'Alex', 20.55)

SELECT Seller, Amount, LAG(Amount,1) OVER (PARTITION BY Seller ORDER BY Seller) AS RunningTotal FROM Sales

基本上在这个例子中,我希望得到以下输出

Seller|Amount|Running Total
Alex|10.00|10.00
Alex|1.25|20.25
Alex|20.55|40.90
Jane|10.25|10.25
Pete|10.25|10.25
Sarah|15.00|15.00
Tracy|10.25|10.25
Tracy|11.00|21.25
Tracy|10.25|31.50

希望有人可以帮助并提前感谢。戴夫

running-totals
  • 1 个回答
  • 17 Views
Martin Hope
Irdis
Asked: 2020-05-07 08:28:21 +0800 CST

运行总计,直到满足特定条件

  • 1

我有一个关于运行总计的问题,我知道有几种方法。但是,我对其进行了轻微修改,并且正在努力寻找正确的方法。

所以我有订单,每个订单都有其唯一的 ID 和数量。数量可以上升(买入)和下降(卖出)。ID 按顺序排列,但并不“密集”,因此两个后续订单之间可能存在间隙。我需要选择所有代表最早位置的订单。位置是连续的订单范围,总和为0,例如(id,qty):(1,1)(2,2)(3,-3)(4,1)(5,-1)-有两个位置,最早的位置由 ID 为 1、2、3 的订单组成。

我目前的做法:

架构

CREATE TABLE [dbo].[orders](
    [id] [int] NULL,
    [qty] [int] NULL
) ON [PRIMARY]

解决方案

create table #or (id int, qty int, rn int)
create clustered index ix_orid on #or(rn)
insert into #or
select *, ROW_NUMBER() over(order by id) as rn from dbo.orders;

with position as (
select o1.*, o1.qty as s from #or o1 where rn = 1
union all
select o1.id, o1.qty, o1.rn, o1.qty + position.s   
from #or o1
join position
on o1.rn = position.rn + 1
where position.s > 0
)
select * from position 
option (maxrecursion 0)

drop table #or

我担心的是我为所有订单创建了大的临时表。并且所有时间都用于创建这张表。我在 dbo.orders 中有大约 ~3.000.000 行,而结果集是 ~15.000。我目前的想法是限制插入#或使用合理数量的顶部提示,并运行几次直到我们完成。但我想知道它是否可以更容易地完成?

sql-server running-totals
  • 1 个回答
  • 425 Views
Martin Hope
Oleg Melnikov
Asked: 2017-10-06 08:38:22 +0800 CST

唯一计数与总计数的运行比率

  • 1

关于如何在 t-SQL(SQL Server 2017 社区版或更高版本)中为有序观察(行)编写计数(唯一和总)的运行比率的任何想法?

给定一个必须排序的数据集(例如按日期索引/排序的时间序列):

CREATE TABLE #x (dt DATE, Name VARCHAR(MAX));
INSERT INTO #x VALUES
('2012-01-01', 'a'),('2012-01-02', 'b'),('2012-01-03', 'c'),
('2012-01-04', 'a'),('2012-01-05', 'b'),('2012-01-06', 'd'),
('2012-01-07', 'a'),('2012-01-08', 'b'),('2012-01-09', 'e'),('2012-01-10', 'e');

因此,给定列Dt和Names,我需要Ratio下面的输出。为清楚起见,我还包含了输出列UCnt,这些列计算迄今为止的唯一名称(即受限制的运行计数)和TCnt统计所有名称的最新数据(即简单运行计数)。输出Ratio字段只是两者的一个运行比例。

Dt          Name    UCnt    TCnt    Ratio
2012-01-01  a       1       1       1.000
2012-01-02  b       2       2       1.000
2012-01-03  c       3       3       1.000
2012-01-04  a       3       4       0.750
2012-01-05  b       3       5       0.600
2012-01-06  d       4       6       0.666
2012-01-07  a       4       7       0.571
2012-01-08  b       4       8       0.500
2012-01-09  e       5       9       0.555
2012-01-10  e       5       10      0.500
sql-server running-totals
  • 2 个回答
  • 830 Views
Martin Hope
Mei_R
Asked: 2016-11-09 05:14:01 +0800 CST

根据先进先出 (FIFO) 计算数量

  • 6

我正在尝试根据 FIFO 获得数量结果,下面有 2 个表格:

表购买:

| PO    | Date         | Quantity | Item | 
|-------|--------------|----------|------|
| PO001 | 01-Jan-2016  | 3        | AO21 |  
| PO002 | 10-Jan-2016  | 7        | AO21 |  
| PO003 | 01-Feb-2016  | 3        | AO21 |  

表库存:

| SO    | Date        | Quantity | Item |
|-------|-------------|----------|------|
| SO001 | 02-Jan-2016 | 2        | AO21 |
| SO002 | 11-Feb-2016 | 8        | AO21 |
| SO003 | 12-Feb-2016 | 6        | AO23 |

我希望输出是这样的:

| SO    | PO    | Quantity |
|-------|-------|----------|
| SO001 | PO001 | 2        |
| SO002 | PO001 | 1        |
| SO002 | PO003 | 7        |

您对查看此输出的查询有任何想法吗?从行中计算的 SO 和 PO 的结果。更多解释:

想要的结果中的 2、1、7 来自哪里?

从stock和purchase。item 的第一个(按日期)库存值为A0212,而第一次购买 ( PO001) 需要 3,所以 stock sold 2 并且我们在结果中得到这一行:

| SO001 | PO001 | 2        |

我们还需要购买 1 个,然后下一个库存值为 8。所以这次购买完成,我们得到 1 个(还有 7 个库存):

| SO002 | PO001 | 1        |

下一次购买 ( PO002) 需要 7 个,而我们正好剩下 7 个,因此购买完成(该商品还剩下 0 个库存)。我们得到:

| SO002 | PO003 | 7        |

购买PO003需要 3,但没有剩余库存,因此我们在该购买的结果中没有任何行。

mysql running-totals
  • 1 个回答
  • 7286 Views
Martin Hope
user20907
Asked: 2016-09-09 19:31:59 +0800 CST

重置后计算运行总计

  • 2

我有一个 SQL Server 2012 表,其中包含客户 ID、金额和重置列。我正在尝试计算运行总计,并在重置后计算运行总计。一旦设置了重置“标志”,那么我想在运行总计之后计算运行总计。

在此处输入图像描述

我有以下代码,不确定是否有办法在断点后计算运行总数。

WITH a
AS
(SELECT
        *
        ,SUM(amount) OVER (ORDER BY id) AS RunningTotal
    FROM Table1)
SELECT
    *
    ,CASE
        WHEN resetYN = 1 THEN 0
        ELSE Amount + LAG(RunningTotal, 1) OVER (ORDER BY id)
    END AS ResetRunningTotal
FROM a
sql-server running-totals
  • 1 个回答
  • 4721 Views
Martin Hope
Kinyanjui Kamau
Asked: 2015-04-08 05:35:09 +0800 CST

合并两个具有不同 where 语句的 Select 查询

  • 0

我在下面有这个查询,我试图在其中获取迄今为止的月份和年份(账户余额)的结果。

SELECT T3.AcctCode, T3.AcctName, SUM(T1.Debit - T1.Credit)* -1 AS 'Balance'
FROM OJDT T0
INNER JOIN JDT1 T1 ON T0.[TransId] = T1.[TransId]
INNER JOIN OACT T2 ON T1.[Account] = T2.[AcctCode]
INNER JOIN OACT T3 ON T3.[AcctCode] = T2.[FatherNum]
WHERE T0.TaxDate BETWEEN '2014-09-01' AND '2014-09-30'
AND T3.AcctCode LIKE '611%'
GROUP BY T3.AcctCode, T3.AcctName
UNION 
SELECT  T3.AcctCode, T3.AcctName, SUM(T1.Debit - T1.Credit)* -1 AS 'YTD Balance'
FROM OJDT T0
INNER JOIN JDT1 T1 ON T0.[TransId] = T1.[TransId]
INNER JOIN OACT T2 ON T1.[Account] = T2.[AcctCode]
INNER JOIN OACT T3 ON T3.[AcctCode] = T2.[FatherNum]
WHERE T0.TaxDate BETWEEN '2014-01-01' AND '2014-09-30'
AND T3.AcctCode LIKE '611%'
GROUP BY T3.AcctCode, T3.AcctName
ORDER BY T3.AcctCode

结果如下:

在此处输入图像描述

我遇到的问题是 Balance 和 Year to Date 余额列堆叠在另一个之上。如何修改此查询以具有 4 列,即:AcctCode、AcctName、Balance、YTD Balance?使用 SQL Server 2008

sql-server-2008 running-totals
  • 1 个回答
  • 213 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve