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