Sql server 从SQL Server SQL获取最小和最大日期

Sql server 从SQL Server SQL获取最小和最大日期,sql-server,Sql Server,我表中的数据如下所示 PAY_END_DT Sal 10/27/2013 0 11/10/2013 0 11/24/2013 2473.14 12/08/2013 0 01/19/2014 0 02/02/2014 0 02/16/2014 0 我期望的结果如下所示 10/27/2013 11/10/2013 12/08/2013 02/16/2014 我需要一个SQL来生成这个结果集。。请帮助我 以您的数据为例: PAY_END_DT Sal FULL_SET_

我表中的数据如下所示

PAY_END_DT  Sal
10/27/2013  0
11/10/2013  0
11/24/2013  2473.14
12/08/2013  0
01/19/2014  0
02/02/2014  0
02/16/2014  0
我期望的结果如下所示

10/27/2013 11/10/2013
12/08/2013 02/16/2014
我需要一个SQL来生成这个结果集。。请帮助我

以您的数据为例:

PAY_END_DT  Sal      FULL_SET_ORIDINAL  ZERO_SET_ORDINAL  "FULL - ZERO"
10/27/2013  0        1                  1                 0
11/10/2013  0        2                  2                 0
11/24/2013  2473.14  3                  1                 2
12/08/2013  0        4                  3                 1
01/19/2014  0        5                  4                 1
02/02/2014  0        6                  5                 1
02/16/2014  0        7                  6                 1
这样我们就可以只包含sal=0的行,然后按“满零”分组,得到两个集合,最后应用
MIN()
MAX()
函数

正如评论中所述,这被称为“缺口和孤岛”


尝试将“我需要一个SQL”替换为“我已经尝试了这个SQL查询,但它不起作用”,然后替换为“这是我尝试使用的查询”。这个网站是为了编程帮助,而不是“为我做我的工作”。你的答案集中的两行有什么区别?你的问题没有很好的说明。看起来您正试图解决一个“孤岛和缺口”样式的问题,但您没有说明为什么您特别期待这个结果。输入和输出之间的关系是什么?解释逻辑——我的意思是,确切地说,你的老板叫你做什么?好的巨魔,但这不是用来摆放的地方。@ RADUGHOGHIHU个人,根据所提供的信息,我认为这个答案是完全有效的。“Strawberry True,就像我说的,这是一个很好的巨魔,但是StackOverflow鼓励诚实和有益的回答。顺便说一句,我没有对答案投反对票。@草莓-在“技术上正确”和“建设性或有用”之间有着天壤之别。如果某事物不是后者,则它在StackOverflow上没有位置。(在此基础上,我认为它不是“完全有效的”;因为它无法满足SO答案的明确意图。)@MatBailie也许我们应该努力做到两者兼顾。您好,感谢SQL。我的sql输出应该是员工ID、开始日期和结束日期。在我的数据集中,员工12345从2013年10月27日到2013年11月10日,再从2013年12月8日到2014年2月26日没有收到Sal。。因此,我希望输出如下:第一行为1234510/27/1311/10/13,第二行为1234512/08/1302/26/14。希望这是更多的信息。提前感谢您的帮助。@Ravi-那么只需将EmployeId添加到GROUP BY和PARTITION BY子句中即可。@Ravi-请您投票支持并接受答案好吗?
SELECT
    employee_id,
    MIN(pay_end_dt)   AS island_min_pay_end_dt,
    MAX(pay_end_dt)   AS island_max_pay_end_dt
FROM
(
    SELECT
        pay_end_dt,
        ROW_NUMBER() OVER (PARTITION BY employee_id,
                               ORDER BY pay_end_dt   )     AS full_set_ordinal,
        ROW_NUMBER() OVER (PARTITION BY employee_id, sal
                               ORDER BY pay_end_dt   )     AS zero_set_ordinal
    FROM
        yourTable
)
    AS sorted_set
WHERE
    sal = 0
GROUP BY
    employee_id,
    full_set_ordinal - zero_set_ordinal
;
PAY_END_DT  Sal      FULL_SET_ORIDINAL  ZERO_SET_ORDINAL  "FULL - ZERO"
10/27/2013  0        1                  1                 0
11/10/2013  0        2                  2                 0
11/24/2013  2473.14  3                  1                 2
12/08/2013  0        4                  3                 1
01/19/2014  0        5                  4                 1
02/02/2014  0        6                  5                 1
02/16/2014  0        7                  6                 1
    1 1 1   1   
0 0       0   0 0

1 2 3 4 5 6 7 8 9   - ordinal from the whole set

    1 2 3   4       - ordinal from just the "islands"
1 2       3   4 5   - ordinal from just the "gaps"

    2 2 2   3       - ordinal of the "islands"  (whole_set_id - islands_id)
0 0       3   4 4   - ordinal of the "gaps"     (whole_set_id - gaps_id)