Questions tagged «aggregate»

将多个数据点合并为一个数据点。通常用于引用SQL,通常用于某种聚合函数。

5
存储与计算合计值
是否有任何准则或经验法则来确定何时存储合计值以及何时动态计算合计值? 例如,假设我有一些用户可以评价的小部件(请参见下面的架构)。每次我显示一个小部件时,我都可以从Ratings表中计算平均用户评分。或者,我可以在Widget表上存储平均评分。这样可以避免我每次显示窗口小部件时都必须计算评分,但是随后,用户每次对窗口小部件进行评分时,我都必须重新计算平均评分。 Ratings Widgets --------- ------- widget_id widget_id user_id name rating avg_rating <--- The column in question


7
编写一个简单的银行架构:如何使我的余额与他们的交易记录保持同步?
我正在为一个简单的银行数据库编写模式。基本规格如下: 数据库将针对用户和货币存储交易。 每个用户每种货币都有一个余额,因此每个余额只是针对给定用户和货币的所有交易的总和。 余额不能为负。 银行应用程序将专门通过存储过程与其数据库进行通信。 我希望该数据库每天可以接受成千上万的新交易,并且可以平衡更高数量级的查询。要非常快地用完余额,我需要预先对其进行汇总。同时,我需要保证余额永远不会与其交易历史相矛盾。 我的选择是: 有一个单独的balances表,然后执行下列操作之一: 将交易应用到transactions和balances表。TRANSACTION在存储过程层中使用逻辑,以确保余额和交易始终保持同步。(由Jack支持。) 将交易应用到transactions表格,并使用触发器balances为我更新交易金额。 将事务应用于balances表,并具有一个触发器,该触发器transactions为我在表中添加一个具有事务量的新条目。 我必须依靠基于安全性的方法来确保在存储过程之外无法进行任何更改。否则,例如,某些过程可能会直接将事务插入transactions表中,而根据计划1.3,相关余额将不同步。 有一个balances索引视图可以适当地汇总事务。存储引擎保证余额与事务保持同步,因此我不需要依靠基于安全性的方法来保证这一点。另一方面,由于视图-甚至是索引视图-都没有CHECK约束,因此我不能再将余额强制为非负数。(由Denny支持。) 仅具有一个transactions表,但具有一个附加列来存储该交易执行后立即生效的余额。因此,用户和货币的最新交易记录也包含其当前余额。(下面由安德鲁建议;由garik提出。) 当我第一次解决这个问题时,我阅读了这 两个讨论并决定选择2。作为参考,您可以在此处看到其基本实现。 您是否设计或管理了这样的具有高负载配置文件的数据库?您如何解决此问题? 您认为我做出了正确的设计选择吗?我有什么要记住的吗? 例如,我知道对transactions表的架构更改将需要我重建balances视图。即使我在归档事务以保持数据库较小(例如,通过将它们移动到其他地方并用汇总事务替换),每次架构更新都必须从数千万个事务中重建视图,这可能意味着每个部署的停机时间会大大增加。 如果要使用索引视图,如何保证没有余额是负数? 归档交易: 让我详细说明一下归档事务和上面提到的“摘要事务”。首先,在这样的高负载系统中,定期归档将是必要的。我想保持余额与交易记录之间的一致性,同时允许将旧交易移至其他位置。为此,我将使用每位用户和货币金额的摘要替换每一批已归档的交易。 因此,例如,以下交易清单: user_id currency_id amount is_summary ------------------------------------------------ 3 1 10.60 0 3 1 -55.00 0 3 1 -12.12 0 已归档并替换为: user_id currency_id amount is_summary ------------------------------------------------ 3 1 -56.52 1 …

14
消除ListAgg(Oracle)中的重复项
在Oracle 11.2之前,我使用自定义聚合函数将一列连接成一行。11.2添加了该LISTAGG功能,因此我尝试使用该功能。我的问题是我需要消除结果中的重复项,而且似乎无法做到这一点。 这是一个例子。 CREATE TABLE ListAggTest AS ( SELECT rownum Num1, DECODE(rownum,1,'2',to_char(rownum)) Num2 FROM dual CONNECT BY rownum<=6 ); SELECT * FROM ListAggTest; NUM1 NUM2 ---------- --------------------- 1 2 2 2 << Duplicate 2 3 3 4 4 5 5 6 6 我想看的是: NUM1 NUM2S ---------- -------------------- 1 2-3-4-5-6 2 …


7
在SQL Server 2005上获取最少的多列的最有效方法是什么?
我要从6列中获取最小值。 到目前为止,我已经找到了三种方法来实现此目的,但是我对这些方法的性能感到担忧,并且想知道哪种方法对性能更好。 第一种方法是使用大写语句。这是一个包含3列的示例,基于上面链接中的示例。我的案例陈述将更长,因为我将查看6列。 Select Id, Case When Col1 <= Col2 And Col1 <= Col3 Then Col1 When Col2 <= Col3 Then Col2 Else Col3 End As TheMin From MyTable 第二种选择是将UNION运算符与多个select语句一起使用。我将其放在接受Id参数的UDF中。 select Id, dbo.GetMinimumFromMyTable(Id) from MyTable 和 select min(col) from ( select col1 [col] from MyTable where Id = @id union …

3
为什么ANSI SQL将SUM(无行)定义为NULL?
的ANSI SQL标准定义(第6.5章,集功能规范),用于空的结果集的集合函数以下行为: COUNT(...) = 0 AVG(...) = NULL MIN(...) = NULL MAX(...) = NULL SUM(...) = NULL 由于未定义空集的平均值,最小值和最大值,因此对AVG,MIN和MAX返回NULL十分合理。 但是,最后一个让我感到困扰:从数学上来说,空集的SUM是定义明确的:0。使用0 (加法的中性元素)作为基本情况可以使所有内容保持一致: SUM({}) = 0 = 0 SUM({5}) = 5 = 0 + 5 SUM({5, 3}) = 8 = 0 + 5 + 3 SUM({5, NULL}) = NULL = 0 + 5 …


3
Access(Jet)SQL:TableB中的DateTime戳位于TableA中每个DateTime戳的侧面
第一句话 您可以放心地忽略以下(和包括)JOIN的部分:如果仅想破解代码,则从Start入手。的背景和结果只是作为背景。如果您想查看最初的代码,请查看2015年10月6日之前的编辑历史记录。 目的 最终,我想根据表中可用GPS数据的DateTime时间戳(直接在表中观察数据的侧面)来计算发射机(X或Xmit)的内插GPS坐标。SecondTableFirstTable 我的近期目标实现的最终目标是要弄清楚如何最好地加入FirstTable到SecondTable得到这些侧翼的时间点。以后,我可以使用这些信息,并假设沿着等矩形坐标系进行线性拟合,就可以计算GPS中间坐标(用奇特的话说,我不在乎地球是这个范围的球体)。 问题 有没有更有效的方法来生成最接近的前后时间戳? 由我自己解决,方法是仅抓住“之后”,然后仅获取与“之后”相关的“之前”。 是否有一种不涉及(A<>B OR A=B)结构的更直观的方法。 Byrdzeye提供了基本的替代方法,但是我的“现实世界”经验与他的所有4种执行相同策略的加入策略并不一致。但是,他对替代连接样式的解决也深表感谢。 您可能还有其他想法,窍门和建议。 到目前为止,byrdzeye和Phrancis在这方面都非常有帮助。我发现Phrancis的建议非常出色,并在关键阶段提供了帮助,因此在这里我将给予他优势。 我仍然很感激我在问题3方面能获得的任何其他帮助。项目 符号反映了我认为对个人问题最有帮助的人。 表定义 半视觉表示 第一表 Fields RecTStamp | DateTime --can contain milliseconds via VBA code (see Ref 1) ReceivID | LONG XmitID | TEXT(25) Keys and Indices PK_DT | Primary, Unique, No Null, Compound XmitID | …

3
在PostgreSQL中,是否存在类型安全的first()聚合函数?
完整问题重写 我在寻找First()聚合函数。 在这里,我发现了几乎可行的方法: CREATE OR REPLACE FUNCTION public.first_agg ( anyelement, anyelement ) RETURNS anyelement LANGUAGE sql IMMUTABLE STRICT AS $$ SELECT $1; $$; -- And then wrap an aggregate around it CREATE AGGREGATE public.first ( sfunc = public.first_agg, basetype = anyelement, stype = anyelement ); 问题在于,当varchar(n)列通过first()函数时,它将转换为简单的varchar(无大小)。尝试以函数RETURNS SETOF anyelement的形式返回查询时,出现以下错误: 错误:查询的结构与函数结果类型不匹配Estado de …

1
滚动总和/计数/日期间隔内的平均值
在一个涵盖18个月内成千上万个实体的交易的数据库中,我想运行一个查询,以将每个可能的30天期限entity_id与该30天内的交易金额和COUNT 个交易的总和进行分组。以我可以查询的方式返回数据。经过大量测试,此代码完成了我想要的大部分工作: SELECT id, trans_ref_no, amount, trans_date, entity_id, SUM(amount) OVER(PARTITION BY entity_id, date_trunc('month',trans_date) ORDER BY entity_id, trans_date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS trans_total, COUNT(id) OVER(PARTITION BY entity_id, date_trunc('month',trans_date) ORDER BY entity_id, trans_date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS trans_count FROM transactiondb; 我将在更大的查询中使用类似以下内容的结构: SELECT * FROM …

4
将单独的范围合并为最大可能的连续范围
我正在尝试合并多个日期范围(我的负载最多约为500,大多数情况下为10),这些日期范围可能会或可能不会重叠到最大的连续日期范围内。例如: 数据: CREATE TABLE test ( id SERIAL PRIMARY KEY NOT NULL, range DATERANGE ); INSERT INTO test (range) VALUES (DATERANGE('2015-01-01', '2015-01-05')), (DATERANGE('2015-01-01', '2015-01-03')), (DATERANGE('2015-01-03', '2015-01-06')), (DATERANGE('2015-01-07', '2015-01-09')), (DATERANGE('2015-01-08', '2015-01-09')), (DATERANGE('2015-01-12', NULL)), (DATERANGE('2015-01-10', '2015-01-12')), (DATERANGE('2015-01-10', '2015-01-12')); 表看起来像: id | range ----+------------------------- 1 | [2015-01-01,2015-01-05) 2 | [2015-01-01,2015-01-03) 3 | [2015-01-03,2015-01-06) …



1
使用子查询时,Postgres错误[列必须出现在GROUP BY子句中或在聚合函数中使用]
我有两个桌子employee和phones。员工可以使用0到n个电话号码。我想列出员工姓名和他们的电话号码。我正在使用下面的查询运行正常。 SELECT empname,array_agg(phonenumber) AS phonenumbers FROM employee LEFT OUTER JOIN phones ON employee.empid = phones.empid GROUP BY employee.empid 员工表可能包含大量行。我一次只想获取一些员工。例如,我想获取3名员工的电话号码。我正在尝试运行此查询。 SELECT empname,array_agg(phonenumber) AS phonenumbers FROM (SELECT * FROM employee ORDER BY empname LIMIT 3 OFFSET 0) AS employee LEFT OUTER JOIN phones ON employee.empid = phones.empid GROUP BY employee.empid 但是我得到这个错误。ERROR: column …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.