T-SQL LAG函数默认值

时间:2019-04-02 11:38:12

标签: sql tsql window-functions

如果联接表中没有记录并且您仅引用联接表字段,为什么LAG函数的默认参数仅适用于返回结果的第一列?

为了更好地解释这一点,我创建了以下情形。

架构

  CREATE TABLE Blogs(
    Id int IDENTITY(1,1) CONSTRAINT PK_Blogs_Id PRIMARY KEY,
    Title NVARCHAR(1000)
  )

  CREATE TABLE Comments(
    Id int IDENTITY(1,1) CONSTRAINT PK_Comments_Id PRIMARY KEY,
    BlogId INT NOT NULL,
    CommentText NVARCHAR(max)
  )

  INSERT INTO Blogs (Title) VALUES ('Blog 1')
  INSERT INTO Blogs (Title) VALUES ('Blog 2')
  INSERT INTO Blogs (Title) VALUES ('Blog 3')
  INSERT INTO Blogs (Title) VALUES ('Blog 4')
  INSERT INTO Blogs (Title) VALUES ('Blog 5')

  INSERT INTO Comments (BlogId, CommentText) VALUES (4,'Some text')
  INSERT INTO Comments (BlogId, CommentText) VALUES (4,'Some text 2')

查询

SELECT *, 
  LAG(CommentText,1,'No comment') OVER (Partition by Comments.BlogId ORDER BY Comments.Id Desc) LastComment
FROM Blogs LEFT JOIN Comments on Blogs.Id = Comments.BlogId;

在上面的查询中,它将在第一行中为LastComment返回带有“无评论”的结果,并且该行中有其他评论,其余的将为null。

如果您在窗口函数(下面的查询)中引用Blogs的键,我知道它可以正常工作(所有为null的行在LastComment字段中返回'No comment'),但是我试图理解为什么如果联接返回null,为什么不在LastComment LAG函数中应用默认参数。

SELECT *, 
  LAG(CommentText,1,'No comment') OVER (Partition by Blogs.Id ORDER BY Comments.Id Desc) LastComment
FROM Blogs LEFT JOIN Comments on Blogs.Id = Comments.BlogId;

这是场景http://sqlfiddle.com/#!18/eb850/9的SQL小提琴

0 个答案:

没有答案