Sql 如何标记记录时的";空心的;在接下来的连续序列中?

Sql 如何标记记录时的";空心的;在接下来的连续序列中?,sql,sql-server,Sql,Sql Server,任务:如果SQL表中包含列年和月(年和月都是整数;加上包含一些事实的列),那么在缺少下一个月时,如何设置记录的标志 动机,上下文:用户应该填写缺失月份的事实值(想想计划值)。为了简化工作,我在GUI的行末尾显示了一个图标。单击图标将创建下一个月的记录。但是,年和月值是唯一键的一部分。如果下个月的记录已经存在,我不想提出创建下个月。这样做的目的是只显示下个月记录不存在的行的图标(以避免创建重复) 示例: year month flag my comment 2020 1

任务:如果SQL表中包含列
(年和月都是整数;加上包含一些事实的列),那么在缺少下一个月时,如何设置记录的标志

动机,上下文:用户应该填写缺失月份的事实值(想想计划值)。为了简化工作,我在GUI的行末尾显示了一个图标。单击图标将创建下一个月的记录。但是,年和月值是唯一键的一部分。如果下个月的记录已经存在,我不想提出创建下个月。这样做的目的是只显示下个月记录不存在的行的图标(以避免创建重复)

示例:

year  month  flag      my comment
2020    1     0
2020    2     0
2020    3     1        icon should appear here because the next month (2020/4) should be created 
2020    5     0
2020    6     0
2020    7     0
2020    8     1        icon should appear because the month 9 and 10 are missing
2020   11     0
2020   12     0        December is followed by the next-year January, no icon 
2021    1     0
2021    2     0
2021    3     0
2021    5     0
2021    6     0
2021    7     1        the last record in the sequence -- show icon to create the next month
如何使用单个
SELECT
语句编写查询?我在本例中使用MS SQL 2014。

您可以使用
lead()
和一些算法:

select t.*,
       (case when lead(year*12 + month) over (order by year, month) = year*12 + month + 1
             then 0 else 1
        end) as flag
from t;

这很好。戈登,谢谢你的解决方案。它工作得很好。无论如何,为什么最后一条记录也返回1?这就是我想要的,但解释是什么呢。我已经看过医生了。对于不存在的记录,
LEAD
返回
NULL
(如果没有明确给出另一个默认值。因此,它将NULL与某个数字进行比较,并且该数字永远不相等。因此,else分支返回1。是否正确?@pepr…对于最后一条记录,
LEAD()
返回
NULL
,表达式将其转换为
NULL
…因此条件被视为false。