标签: window-functions

在 Microsoft SQL Server 2008 中,语法会生成错误“未启用并行数据仓库 (PDW) 功能”。

我从排序分区上的聚合生成了以下虚拟列,

MIN(picture_id) OVER ( PARTITION BY [360_set] ORDER BY picture_id ASC )
Run Code Online (Sandbox Code Playgroud)

但是,当我执行它时,我得到以下信息。

Msg 11305, Level 15, State 10, Line 12
The Parallel Data Warehouse (PDW) features are not enabled.
Run Code Online (Sandbox Code Playgroud)

不过,这就是有趣的地方,没有分区上的排序顺序,它可以工作:

MIN(picture_id) OVER ( PARTITION BY [360_set] )
Run Code Online (Sandbox Code Playgroud)

此外,ROW_NUMBER()窗口函数(不是聚合函数)在分区上以显式顺序工作。

ROW_NUMBER() OVER ( PARTITION BY [360_set] ORDER BY picture_id ASC )
Run Code Online (Sandbox Code Playgroud)

为什么所需的语句不起作用?这是在哪里记录的?版本信息被请求,这是我在帮助→关于中的内容。

Microsoft SQL Server Management Studio          10.0.5512.0
Microsoft Analysis Services Client Tools        10.0.5500.0
Microsoft Data Access Components (MDAC)         6.1.7601.17514
Microsoft MSXML                                 3.0 6.0 
Microsoft Internet Explorer                     9.10.9200.16635
Microsoft …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008-r2 window-functions

8
推荐指数
1
解决办法
1万
查看次数

存储数百万行非标准化数据或一些 SQL 魔法?

我的 DBA 经验只是简单的存储 + CMS 样式数据的检索 - 所以这可能是一个愚蠢的问题,我不知道!

我有一个问题,我需要查找或计算特定组大小和特定时间段内特定天数的假期价格。例如:

1 月任何时候 2 人 4 晚的酒店房间多少钱?

例如,我有 5000 家酒店的定价和可用性数据,如下所示:

Hotel ID | Date | Spaces | Price PP
-----------------------------------
     123 | Jan1 | 5      | 100
     123 | Jan2 | 7      | 100
     123 | Jan3 | 5      | 100
     123 | Jan4 | 3      | 100
     123 | Jan5 | 5      | 100
     123 | Jan6 | 7      | 110
     456 | Jan1 | 5      | 120
     456 | Jan2 …
Run Code Online (Sandbox Code Playgroud)

postgresql window-functions datetime denormalization

8
推荐指数
1
解决办法
769
查看次数

如何在 postgres 中优化窗口查询

我有下表,大约有 175k 条记录:

    Column     |            Type             |              Modifiers
----------------+-----------------------------+-------------------------------------
 id             | uuid                        | not null default uuid_generate_v4()
 competition_id | uuid                        | not null
 user_id        | uuid                        | not null
 first_name     | character varying(255)      | not null
 last_name      | character varying(255)      | not null
 image          | character varying(255)      |
 country        | character varying(255)      |
 slug           | character varying(255)      | not null
 total_votes    | integer                     | not null default 0
 created_at     | timestamp without time zone |
 updated_at     | timestamp without time …
Run Code Online (Sandbox Code Playgroud)

postgresql performance index-tuning window-functions rank query-performance

7
推荐指数
1
解决办法
6173
查看次数

SQL Server 2008 R2 中的超前/滞后实现:超出最大内存

背景

我正在尝试建立一个“访问”序列,其中如果在基本相同的地方(General_Location)检测到动物,则算作一次访问,但如果它去其他地方然后返回,则是对同一位置的额外访问。因此,如果在一个Location序列
A1, A2, A3, A3, A3, A1, B2, D4, A2
中检测到动物,例如所有 A(n) 位置都属于General_Location“A”,则前 6 个检测为访问 1 (@A),接下来为访问 2 (@B),接下来为访问 3 (@D),接下来是访问 4(返回 @A)。

由于LAG并且LEAD在 SQL Server 2008R2 中不可用(也不UNBOUNDED PRECEDINGPARTITIONing 子句中),我正在尝试解决此SQL 权威博客条目中所述的变通方法。

我遇到了以下内存问题(更不用说计算时间了):

WITH s AS (
    SELECT
        RANK() OVER (PARTITION BY det.Technology, det.XmitID ORDER BY DetectDate ASC, ReceiverID ASC) as DetID,
        COALESCE(TA.AnimalID, det.Technology+'-'+cast(da.XmitID AS nvarchar), 'BSVALUE999') as AnimalID,
        det.Technology, det.XmitID, DetectDate, det.location as …
Run Code Online (Sandbox Code Playgroud)

performance sql-server sql-server-2008-r2 window-functions query-performance

7
推荐指数
1
解决办法
2010
查看次数

产品最近 4 次运行的平均值

我需要显示产品在过去 4 次生产中的平均重量。除了示例之外,我不知道如何最好地描述它:让我们想象一下,我有下表按创建日期列出了产品,以及当天产品的平均重量:

+---------+---------+--------+
| Product |  Date   | Weight |
+---------+---------+--------+
|  900000 | Jan 1   | 20.0   |
|  900000 | March 3 | 12.2   |
|  900000 | July 6  | 15.0   |
|  900000 | July 7  | 14.0   |
|  900000 | Aug 6   | 3.0    |
|  800000 | June 2  | 14.0   |
|  800000 | June 3  | 12.0   |
+---------+---------+--------+
Run Code Online (Sandbox Code Playgroud)

我正在寻找的最终结果是添加一个列,其中包含产品运行的最后 4 个日期的平均重量,因此如下所示:

+---------+---------+--------+----------------+
| Product |  Date   | Weight | …
Run Code Online (Sandbox Code Playgroud)

sql-server aggregate sql-server-2012 window-functions

7
推荐指数
2
解决办法
404
查看次数

我可以只计算连续记录的 ROW_NUMBER() 吗?

我需要计算连续值的序列号。这听起来像是一份工作ROW_NUMBER()

DECLARE @Data TABLE
    (
    Sequence    TINYINT NOT NULL PRIMARY KEY,
    Subset  CHAR(1) NOT NULL
    )
INSERT INTO @Data (Sequence, Subset) VALUES
    (1, 'A'),
    (2, 'A'),
    (3, 'A'),
    (4, 'B'),  -- New subset
    (5, 'B'),
    (6, 'A')   -- New subset

SELECT
    Sequence, Subset,
    ROW_NUMBER() OVER (PARTITION BY Subset ORDER BY Sequence) AS SeqWithinGroup
FROM
    @Data
Run Code Online (Sandbox Code Playgroud)

我希望该PARTITION子句在 中的每次更改时重置计数Subset,但 SQL Server 会收集给定Subset值的所有值并对它们进行编号。这是我所期望的,以及我得到的:

Sequence Subset Expected Actual
-------- ------ -------- -----
1        A      1        1 …
Run Code Online (Sandbox Code Playgroud)

sql-server window-functions gaps-and-islands sql-server-2017

7
推荐指数
1
解决办法
5379
查看次数

将没有列的 ROW_NUMBER() 添加到 ORDER BY?

所以我正在研究一个代码高尔夫拼图,需要在保持当前顺序的同时向结果添加一个 INT“数字”列n

假设我的源数据是:

SELECT value
FROM STRING_SPLIT('one,two,three,four,five', ',')
Run Code Online (Sandbox Code Playgroud)

它以原始(所需)顺序返回项目:

value
-----
one
two
three
four
five
Run Code Online (Sandbox Code Playgroud)

如果我尝试使用ROW_NUMBER()RANK()我被迫指定一个ORDER BY,这value是唯一合法的选择:

SELECT value, n = ROW_NUMBER() OVER(ORDER BY value)
FROM STRING_SPLIT('one,two,three,four,five',',')
Run Code Online (Sandbox Code Playgroud)

但这(如预期)按value字母顺序排序,而不是按所需的原始顺序排列:

value   n
------ ---
five    1
four    2
one     3
three   4
two     5
Run Code Online (Sandbox Code Playgroud)

连接到数字表不起作用,因为如果没有WHERE子句,我将获得完整的外部连接。

我能想到的最好的方法是使用带有标识字段的临时表:

CREATE TABLE #argg (n INT IDENTITY(1,1), v VARCHAR(99))

INSERT #argg 
SELECT value v
FROM STRING_SPLIT('one,two,three,four,five',',')

SELECT *
FROM #argg …
Run Code Online (Sandbox Code Playgroud)

sql-server order-by window-functions sql-server-2017

7
推荐指数
3
解决办法
5879
查看次数

解释 OVER 子句

我看到了一个简洁的 TSQL 语句,它有效地将字符串拆分为其组成字符,每行一个,目的是评估ascii每个字符的值。

如果我正确地、有效地阅读了查询,将使用 3 个 CTE 来准备一个包含 10,000 行的 1 列表,每行的值为“0”。

第四个 CTE 定义如下:

cteTally(n) AS(
    SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) n 
    FROM E4
)
Run Code Online (Sandbox Code Playgroud)

随后,这个 CTE 被连接到一个包含感兴趣字符串列的表中,如下所示select

SELECT n, SUBSTRING(LastName, n, 1), ASCII( SUBSTRING(LastName, n, 1))
Run Code Online (Sandbox Code Playgroud)

也就是说,行号 n,然后是 LastName 中的第 n 个字符,然后是该字符的 ascii 值。

我的问题与over上述 CTE 中的条款有关。

本质上,它到底在做什么?

如果我们从 10,000 个相同的行中查询 row_number,为什么我们根本需要一个order by子句?为什么order by放入over条款,而不是作为一个order by在子句select声明-尤其是在over条款甚至没有指定任何分区?(我认为这意味着操作的窗口row_number是完整的 …

sql-server t-sql window-functions

7
推荐指数
1
解决办法
1904
查看次数

带有窗口函数的 OUTPUT 子句

该条款中是否存在未记录的限制OUTPUT,或者这是一个错误?

给出下表:

CREATE TABLE t1 (SomeId int, flag bit, value int);
Run Code Online (Sandbox Code Playgroud)

我想在UPDATE语句中使用计算值,然后使用OUTPUT输出该值。请注意,计算值未在该部件中使用SET,这可能允许通过输出左侧列来解决问题。

以下工作正常,它是一个完美标准的可更新子查询(派生表)。

UPDATE subT1
SET flag = 1
OUTPUT inserted.SomeValue
FROM (
    SELECT *,
      SomeValue = t1.value + 123
    FROM t1
) subT1;
Run Code Online (Sandbox Code Playgroud)

然而使用窗口函数会出现一个奇怪的错误:

UPDATE subT1
SET flag = 1
OUTPUT inserted.Sum
FROM (
    SELECT *,
      Sum = SUM(t1.value) OVER (PARTITION BY t1.SomeId)
    FROM t1
) subT1;
Run Code Online (Sandbox Code Playgroud)
Msg 404 Level 16 State 1 Line 3
The column reference "inserted.Sum" is not …
Run Code Online (Sandbox Code Playgroud)

sql-server window-functions output-clause

7
推荐指数
1
解决办法
286
查看次数

基于累积总和的数据分组

我一直在网上寻找答案,但真的不知道如何正确地制定我想要实现的目标以及是否可能,如果问题听起来很愚蠢,请抱歉。我正在使用 Postgresql。

我每天都有价格数据。

CREATE TEMP TABLE Price (id,Day, Price) AS 
VALUES
  (1, 1, 40),
  (2, 1, 20),
  (3, 1, 50),
  (4, 1, 10),
  (5, 1, 20),
  (6, 1, 60),
  (7, 2, 10),
  (8, 2, 40),
  (9, 2, 10),
  (10,2, 20),
  (11,2, 10);
Run Code Online (Sandbox Code Playgroud)

我想根据日期和价格总和为价格数据分配数字(1、2、3...)。每当总和 > 60 时,总和计算再次开始 + 每次到达新的一天时,总和计算再次开始。例如:

第 1 行 [第 1 天,价格 40] = 1。然后对于第 2 行 [第 1 天,价格 20],价格总和为 20 + 40 < 61,因此第 2 行也被分配给 1。然后对于第 3 行 [第 1 天, price 50] 价格总和是 20 …

postgresql window-functions gaps-and-islands sum

6
推荐指数
1
解决办法
2578
查看次数