Questions tagged «window-functions»

一个对结果集进行分区并在该分区内计算某些内容而不汇总该分区中数据的函数。

6
使用窗口功能的日期范围滚动总和
我需要计算日期范围内的滚动总和。为了说明这一点,使用AdventureWorks示例数据库,以下假设语法将完全满足我的需要: SELECT TH.ProductID, TH.TransactionDate, TH.ActualCost, RollingSum45 = SUM(TH.ActualCost) OVER ( PARTITION BY TH.ProductID ORDER BY TH.TransactionDate RANGE BETWEEN INTERVAL 45 DAY PRECEDING AND CURRENT ROW) FROM Production.TransactionHistory AS TH ORDER BY TH.ProductID, TH.TransactionDate, TH.ReferenceOrderID; 可悲的是,RANGE窗口框架范围当前在SQL Server中不允许间隔。 我知道我可以使用子查询和常规(非窗口)聚合来编写解决方案: SELECT TH.ProductID, TH.TransactionDate, TH.ActualCost, RollingSum45 = ( SELECT SUM(TH2.ActualCost) FROM Production.TransactionHistory AS TH2 …

2
MySQL和窗口函数
似乎MySQL不支持窗口功能。 例如简单:COUNT(*) OVER() AS cnt不起作用。 我不确定这是否也适用于商业版本(我认为社区版本是有限的子集)。 如果没有,如何解决此缺失的功能?

4
将结果限制在前2个排名行中
在SQL Server 2008中,我RANK() OVER (PARTITION BY Col2 ORDER BY Col3 DESC)用来返回带有的数据集RANK。但是我每个分区都有数百条记录,因此我将从1、2、3 ...... 999列中获取值。但我只希望RANKs每个最多2 个PARTITION。 例: ID Name Score Subject 1 Joe 100 Math 2 Jim 99 Math 3 Tim 98 Math 4 Joe 99 History 5 Jim 100 History 6 Tim 89 History 7 Joe 80 Geography 8 Tim 100 …

4
在窗口功能中使用DISTINCT和OVER
我正在尝试将查询从Oracle迁移到SQL Server 2014。 这是我的查询,在Oracle中效果很好: select count(distinct A) over (partition by B) / count(*) over() as A_B from MyTable 这是我尝试在SQL Server 2014中运行此查询后遇到的错误。 Use of DISTINCT is not allowed with the OVER clause 有人知道是什么问题吗?在SQL Server中可以进行这种查询吗?请指教。

6
从表中查找“ n”个连续的免费电话
我有一些这样的数字表(状态为免费或已分配) id_set号状态 ----------------------- 1 000001已分配 1 000002免费 1 000003已分配 1 000004免费 1 000005免费 1 000006已分配 1 000007已分配 1 000008免费 1 000009免费 1 000010免费 1 000011已分配 1 000012分配 1 000013已分配 1 000014免费 1 000015已分配 并且我需要找到“ n”个连续数字,因此对于n = 3,查询将返回 1 000008免费 1 000009免费 1 000010免费 它应仅返回每个id_set的第一个可能的组(实际上,每个查询仅对id_set执行一次) 我正在检查WINDOW函数,尝试了诸如之类的查询COUNT(id_number) OVER (PARTITION BY id_set ROWS …

1
运行总计到上一行
我需要有关开窗功能的帮助。我知道您可以计算一个窗口内的总和以及一个窗口内的运行总额。但是是否可以计算先前的运行总计,即运行总计不包括当前行? 我认为您将需要使用ROWor RANGE参数。我知道有一个CURRENT ROW选项,但我需要CURRENT ROW - 1,这是无效的语法。我对ROW和RANGE参数的了解有限,因此将非常感谢您的帮助。 我知道有这个问题的许多解决方案,但我看明白了ROW,RANGE争论,我以为这个问题可以用这些被破解。我提供了一种可能的方法来计算以前的总运行量,但我想知道是否有更好的方法: USE AdventureWorks2012 SELECT s.SalesOrderID , s.SalesOrderDetailID , s.OrderQty , SUM(s.OrderQty) OVER (PARTITION BY SalesOrderID) AS RunningTotal , SUM(s.OrderQty) OVER (PARTITION BY SalesOrderID ORDER BY SalesOrderDetailID) - s.OrderQty AS PreviousRunningTotal -- Sudo code - I know this does not work --, SUM(s.OrderQty) OVER …

7
分组或窗口
我有一种情况,我认为可以使用窗口函数解决,但我不确定。 想象一下下表 CREATE TABLE tmp ( date timestamp, id_type integer ) ; INSERT INTO tmp ( date, id_type ) VALUES ( '2017-01-10 07:19:21.0', 3 ), ( '2017-01-10 07:19:22.0', 3 ), ( '2017-01-10 07:19:23.1', 3 ), ( '2017-01-10 07:19:24.1', 3 ), ( '2017-01-10 07:19:25.0', 3 ), ( '2017-01-10 07:19:26.0', 5 ), …


1
将两个事件表合并为一个时间表
给定两个表: CREATE TABLE foo (ts timestamp, foo text); CREATE TABLE bar (ts timestamp, bar text); 我想编写一个查询,对于回报值ts,foo以及bar代表最新的值的统一视图。换句话说,如果foo包含: ts | foo -------- 1 | A 7 | B 并bar包含: ts | bar -------- 3 | C 5 | D 9 | E 我想要一个返回的查询: ts | foo | bar -------------- 1 | A …

2
选择最长的连续序列
我正在尝试在PostgreSQL 9.0中构造一个查询,以获取特定列的最长连续行序列。 请考虑下表: lap_id (serial), lap_no (int), car_type (enum), race_id (int FK) lap_no每个地方都是独特的(race_id, car_type)。 我希望查询为给定的race_id和生成最长的序列car_type,因此它将返回int最高的(或长)。 带有以下数据: 1, 1, red, 1 2, 2, red, 1 3, 3, red, 1 4, 4, red, 1 5, 1, blue, 1 6, 5, red, 1 7, 2, blue, 1 8, 1, green, 1 对于car_type = …

2
使用窗口函数在分区中结转第一个非空值
考虑一个记录访问量的表 create table visits ( person varchar(10), ts timestamp, somevalue varchar(10) ) 考虑这个示例数据(时间戳简化为计数器) ts| person | somevalue ------------------------- 1 | bob |null 2 | bob |null 3 | jim |null 4 | bob | A 5 | bob | null 6 | bob | B 7 | jim | X …

1
为什么批处理模式窗口合计会产生算术溢出?
以下查询在具有SUM的列存储表上执行带窗口的窗口1500 total rows,每个表的值均为0或1,并且溢出INT数据类型。为什么会这样呢? SELECT a, p, s, v, m, n, SUM(CASE WHEN n IS NULL THEN 0 ELSE 1 END) OVER (PARTITION BY s, v, a ORDER BY p) AS lastNonNullPartition FROM ( SELECT a, p, s, v, m, n, RANK() OVER (PARTITION BY v, s, a, p ORDER BY …

1
如何在Postgres中获取窗口函数的集合?
我有一张表,其中包含两列整数数组的排列/组合,第三列包含一个值,如下所示: CREATE TABLE foo ( perm integer[] NOT NULL, combo integer[] NOT NULL, value numeric NOT NULL DEFAULT 0 ); INSERT INTO foo VALUES ( '{3,1,2}', '{1,2,3}', '1.1400' ), ( '{3,1,2}', '{1,2,3}', '0' ), ( '{3,1,2}', '{1,2,3}', '1.2680' ), ( '{3,1,2}', '{1,2,3}', '0' ), ( '{3,1,2}', '{1,2,3}', '1.2680' ), ( …

4
如何编写加总一列以创建离散存储桶的窗口查询?
我有一个表,其中包含一列十进制值,例如: id value size -- ----- ---- 1 100 .02 2 99 .38 3 98 .13 4 97 .35 5 96 .15 6 95 .57 7 94 .25 8 93 .15 我需要完成的工作有点难以描述,因此请耐心等待。我正在尝试做的是创建size列的聚合值,每当前一行的总和为1时(根据降序排列),该列的值就会递增1 value。结果看起来像这样: id value size bucket -- ----- ---- ------ 1 100 .02 1 2 99 .38 1 3 …

1
使用Join和Window函数获取超前和滞后值之间的性能比较
我有20M行的表,每一行有3列:time,id,和value。对于每个id和time,value状态为。我想知道的超前滞后一定的值,time为特定的id。 我使用了两种方法来实现此目的。一种方法是使用连接,另一种方法是使用窗口函数超前/滞后以及在time和上的聚集索引id。 我按执行时间比较了这两种方法的性能。join方法需要16.3秒,而window函数方法需要20秒,这不包括创建索引的时间。这使我感到惊讶,因为在join方法是蛮力的情况下,窗口功能似乎已被改进。 这是这两种方法的代码: 创建索引 create clustered index id_time on tab1 (id,time) 加盟方法 select a1.id,a1.time a1.value as value, b1.value as value_lag, c1.value as value_lead into tab2 from tab1 a1 left join tab1 b1 on a1.id = b1.id and a1.time-1= b1.time left join tab1 c1 on a1.id = c1.id and a1.time+1 …

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.