Questions tagged «window-functions»

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

5
SQL在分区上计数不同
我有一个包含两列的表,我想计算Col_B上的不同值(以Col_A为条件)。 MyTable Col_A | Col_B A | 1 A | 1 A | 2 A | 2 A | 2 A | 3 b | 4 b | 4 b | 5 预期结果 Col_A | Col_B | Result A | 1 | 3 A | 1 | 3 A | …

2
基于时间戳的窗口偏移
我正在编写一个查询,该查询将用于分页社交Feed的结果。这个概念是移动应用程序将请求N个项目,并提供一个我在@CutoffTime下面称为的开始日期时间。截止时间的目的是确定何时应启动分页窗口。我们使用时间戳而不是行偏移量的原因是,即使添加了新的社交内容,时间戳也会使我们在获取较旧的帖子时从一致的位置进行分页。 由于社交Feed可以来自您自己或您的朋友,因此我使用UNION来合并这两个组的结果。最初,我尝试了TheQuery_CTE不使用的逻辑UNION,这太慢了。 这是我所做的(包括相关的表架构): CREATE TABLE [Content].[Photo] ( [PhotoId] INT NOT NULL PRIMARY KEY IDENTITY (1, 1), [Key] UNIQUEIDENTIFIER NOT NULL DEFAULT NEWID(), [FullResolutionUrl] NVARCHAR(255) NOT NULL, [Description] NVARCHAR(255) NULL, [Created] DATETIME2(2) NOT NULL DEFAULT SYSUTCDATETIME(), ); CREATE TABLE [Content].[UserPhotoAssociation] ( [PhotoId] INT NOT NULL, [UserId] INT NOT NULL, [ShowInSocialFeed] BIT …

1
为什么我的SQL Server查询在UPDATE上的行为不同于在SELECT上的行为?
我编写了一个SQL Server查询,该查询在对字段进行分区后将记录更新为具有序号。当我将其作为SELECT语句运行时,一切看起来都很不错: DECLARE @RunDetailID INT = 448 DECLARE @JobDetailID INT SELECT @JobDetailID = [JobDetailID] FROM [RunDetails] WHERE [RunDetailID] = @RunDetailID SELECT [OrderedRecords].[NewSeq9], RIGHT([OrderedRecords].[NewSeq9], 4) FROM ( SELECT [Records].*, [Records].[SortField] + RIGHT('0000' + CAST(ROW_NUMBER() OVER(PARTITION BY [Records].[SortField] ORDER BY [Records].[RunDetailID], [Records].[SortField], [Records].[PieceID]) AS VARCHAR), 4) NewSeq9 FROM ( SELECT [MRDFStorageID], [RunDetailID], …

2
当从带有外部参数化“ where”子句的视图中调用时,窗口函数会导致糟糕的执行计划
很久以前,我遇到了这个问题,我找到了适合自己的解决方法,却忘了它。 但是现在在SO上存在这个问题,所以我愿意提出这个问题。 有一个视图以非常简单的方式(订单+订单行)连接了几个表。 当查询不带where子句的视图时,该视图将返回几百万行。 但是,没有人会这样称呼它。通常的查询是 select * from that_nasty_view where order_number = 123456; 这将返回5m中的10条记录。 重要的是:该视图包含一个窗口函数,该窗口函数rank()完全由始终查询该视图的字段划分: rank() over (partition by order_number order by detail_line_number) 现在,如果使用查询字符串中的文字参数查询此视图(完全如上所示),它将立即返回行。执行计划很好: 使用on的索引在两个表上进行索引查找order_number(返回10行)。 在返回的微小结果上计算窗口。 选择。 但是,当以参数化方式调用视图时,情况会变得很糟: Index scan在所有表上忽略索引。返回5m行。 巨大的加入。 计算所有partitions上的窗口(约50万个窗口)。 Filter 从5m中取出10行。 选择 在涉及参数的所有情况下都会发生这种情况。可以是SSMS: declare @order_number int = 123456; select * from that_nasty_view where order_number = @order_number; 它可以是ODBC客户端,例如Excel: …

3
如何选择组中每列的最后一个非NULL值集?
我正在使用SQL Server 2016,并且正在使用的数据具有以下形式。 CREATE TABLE #tab (cat CHAR(1), t CHAR(2), val1 INT, val2 CHAR(1)); INSERT INTO #tab VALUES ('A','Q1',2,NULL),('A','Q2',NULL,'P'),('A','Q3',1,NULL),('A','Q3',NULL,NULL), ('B','Q1',5,NULL),('B','Q2',NULL,'P'),('B','Q3',NULL,'C'),('B','Q3',10,NULL); SELECT * FROM #tab; 我想要获取列上最后的非空值,val1并按进行val2分组cat和排序t。我正在寻找的结果是 cat val1 val2 A 1 P B 10 C 我所使用的最接近的是正在使用的,LAST_VALUE而忽略了ORDER BY那将不起作用,因为我需要排序的最后一个非空值。 SELECT DISTINCT cat, LAST_VALUE(val1) OVER(PARTITION BY cat ORDER BY (SELECT NULL) ) AS val1, …

5
使用窗口功能优化子查询
由于我的性能调优技能似乎永远不足,我一直想知道是否可以针对某些查询执行更多优化。这个问题涉及的情况是嵌套在子查询中的Windowed MAX函数。 我正在挖掘的数据是在较大组的各个不同组上的一系列事务。我有4个重要字段,一个事务的唯一ID,一批事务的Group ID以及与相应的唯一事务或一组事务相关的日期。多数情况下,组日期与批次的最大唯一交易日期相匹配,但是有时会通过我们的系统进行手动调整,并且在捕获组交易日期之后会进行唯一日期操作。此手动编辑不会通过设计来调整组日期。 我在此查询中识别的是那些唯一日期落在组日期之后的记录。以下示例查询建立了与我的场景大致相当的内容,并且SELECT语句返回了我要查找的记录,但是,我是否以最有效的方式来实现此解决方案?在我的事实表加载期间,这需要花一些时间,因为我的记录计数前9位数字,但是主要是我对子查询的鄙视使我怀疑这里是否有更好的方法。我不太担心任何索引,因为我相信它们已经存在。我正在寻找的是一种替代查询方法,该方法可以实现相同的功能,但效率更高。欢迎任何反馈。 CREATE TABLE #Example ( UniqueID INT IDENTITY(1,1) , GroupID INT , GroupDate DATETIME , UniqueDate DATETIME ) CREATE CLUSTERED INDEX [CX_1] ON [#Example] ( [UniqueID] ASC ) SET NOCOUNT ON --Populate some test data DECLARE @i INT = 0, @j INT = 5, @UniqueDate DATETIME, …

4
存储数以百万计的行的非数字化数据还是某些SQL魔术?
我的DBA经验远不止于简单存储+检索CMS样式数据,还有很多,所以这可能是一个愚蠢的问题,我不知道! 我遇到一个问题,我需要查询或计算特定时间段内特定群体人数和特定天数的假期价格。例如: 一月份任何时候可供4人入住2晚的酒店客房多少钱? 我有像这样存储的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 …

3
在Microsoft SQL Server 2008中,语法生成错误“未启用并行数据仓库(PDW)功能”。
我有以下虚拟列是通过排序分区上的聚合生成的, MIN(picture_id) OVER ( PARTITION BY [360_set] ORDER BY picture_id ASC ) 但是,当我执行该操作时,会得到以下结果。 Msg 11305, Level 15, State 10, Line 12 The Parallel Data Warehouse (PDW) features are not enabled. 尽管这是有趣的地方,但在分区上没有排序顺序,但它的工作原理是: MIN(picture_id) OVER ( PARTITION BY [360_set] ) 而且,ROW_NUMBER()窗口函数(不是聚合函数)在分区上以显式顺序工作。 ROW_NUMBER() OVER ( PARTITION BY [360_set] ORDER BY picture_id ASC ) …
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.