Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将当前行与所有先前行和条件进行比较_Sql_Postgresql - Fatal编程技术网

Sql 将当前行与所有先前行和条件进行比较

Sql 将当前行与所有先前行和条件进行比较,sql,postgresql,Sql,Postgresql,我试图将同一学生的开学日期与之前的开学日期进行比较。如果给定学生的学校开始日期不同,则应检查学校结束日期。如果学校结束日期(来自前几行)与我们当前检查的学生的学校开始日期相同。 然后,我需要考虑的第一个类型是关于MealthEnthDead的子类型,或者我们可以直接键入子类型W.R.t到 SurviaStaskDeals< /Calp>(如果 SurviaStaskDead < /Cord>和当前 SealStaskDistNe< 相同) 我曾尝试使用分区BY子句,但我被卡住了 表格 stude

我试图将同一学生的开学日期与之前的
开学日期进行比较。如果给定学生的
学校开始日期
不同,则应检查
学校结束日期
。如果
学校结束日期
(来自前几行)与我们当前检查的学生的学校开始日期相同。 然后,我需要考虑的第一个类型是关于MealthEnthDead的子类型,或者我们可以直接键入子类型W.R.t到 SurviaStaskDeals< /Calp>(如果<代码> SurviaStaskDead < /Cord>和当前<代码> SealStaskDistNe< <代码>相同)

我曾尝试使用
分区BY
子句,但我被卡住了

表格

student_订户| school_start | school_end | Sub类型
--------------------|--------------|------------|----------- 
22 | 12/7/2016    | 12/8/2016  |       111 
22 | 12/7/2016    | 12/12/2016 |       112 
22 | 12/7/2016    | 12/10/2016 |       112 
22 | 12/7/2016    | 12/20/2016 |       112 
22 | 12/8/2016    | 12/10/2016 |       112 
23 | 12/12/2016   | 12/13/2016 |       111 
23 | 12/12/2016   | 12/12/2016 |       112 
23 | 12/12/2016   | 12/14/2016 |       112 
23 | 12/12/2016   | 12/20/2016 |       112 
23 | 12/13/2016   | 12/20/2016 |       112 
表_输出

student|u订户| school|u start | school|u end | sub类型| First|sub类型
--------------------|--------------|------------|-----------|----------------- 
22 | 12/7/2016    | 12/8/2016  |       111 |             111 
22 | 12/7/2016    | 12/12/2016 |       112 |             111 
22 | 12/7/2016    | 12/10/2016 |       112 |             111 
22 | 12/7/2016    | 12/20/2016 |       112 |             111 
22 | 12/8/2016    | 12/10/2016 |       112 |             111 
23 | 12/12/2016   | 12/13/2016 |       112 |             112 
23 | 12/12/2016   | 12/12/2016 |       113 |             112 
23 | 12/12/2016   | 12/14/2016 |       113 |             112 
23 | 12/12/2016   | 12/20/2016 |       113 |             112 
23 | 12/13/2016   | 12/20/2016 |       113 |             112 
我试着这样做,但我想我在第二条中遗漏了一些东西

SELECT 
  student_id,
  type_of_sub,
  school_start_dt, 
  school_end_dt, 
  case 
    when type_of_sub != min(type_of_sub) OVER (
      PARTITION BY student_id, school_start_dt 
      ORDER by type_of_sub 
      ROWS BETWEEN 1 preceding and 1 preceding
      )
    then 1 
    else 0 
  end as TOB_DIFFERENT, 
  min(type_of_sub) OVER (
    PARTITION BY student_id, school_start_dt 
    ROWS between unbounded preceding and unbounded following
  ) as FIRST_TOB    
FROM students

如果需要第一个值,请使用
first\u value()


他是个傻瓜。

:不为我工作。最初的5行用于学生22,前4行具有相同的开始日期。因此,它为此选择了_sub的min type_作为111。但是,对于第五行,它有不同的开始日期。这就是为什么我们需要检查前几行的结束日期是否与当前开始日期相同。如果是,则应显示该子系统的类型。(在该表中,第五行与同一个学生的前一行中的其他行的开始日期不同。因此,我们开始检查它的EndoRead日期。因为第一行具有相同的EnthDead。我们需要考虑输出中的Type)。”它在order by中使用了两列,因此它是有效的。是的,但是学校结束日期总是不同的,我们需要比较当前学校开始日期和前一个学校结束日期。如果学校开始改变或不一样。@SQLPractice。看那把小提琴。这正是问题所要求的。嗨,戈登,谢谢你的帮助。是的。但是当我添加不同的日期时。不会的。就像在你的dbfiddle中一样,我为22号学生又添加了两个条目,但它仍然显示第一类账单为111,这应该不会发生。至于输入的两行,入学日期不同。第13行条目的开始日期不同,结束日期与以前的开始日期不相关。但它仍然显示111而不是113。对于第14行,开始日期是diff,但开始日期和第13行的结束日期相同,我们仍然得到111作为输出,而不是113。
select s.*,
       first_value(typeofsub) over (partition by student_subscriber order by school_start, school_end) as first_typeofsub
from students s;