SQL ORACLE - 获取序列相等值的最小行

时间:2017-08-29 13:13:12

标签: sql oracle

我的表格类似于:

MY_DAT   | STATUS
=========|========
1.1.2017 | A 
2.1.2017 | A 
3.1.2017 | A 
4.1.2017 | B 
5.1.2017 | B 
6.1.2017 | A 
7.1.2017 | C 
8.1.2017 | A 
9.1.2017 | A 
10.1.2017| A 

我希望SQL查询按日期( MY_DAT )返回最小日期与状态相等而不会中断。
实施例

MY_DAT = '1.1.2017' -> '1.1.2017',A
MY_DAT = '3.1.2017' -> '1.1.2017',A
MY_DAT = '10.1.2017' -> '8.1.2017',A
MY_DAT = '5.1.2017' -> '4.1.2017',B

我不知道这个sql的样子。

修改

我需要每个日期的结果。在此示例中,结果必须是:

MY_DAT   | STATUS | BEGIN
=========|========|========
1.1.2017 | A      |1.1.2017
2.1.2017 | A      |1.1.2017
3.1.2017 | A      |1.1.2017
4.1.2017 | B      |4.1.2017
5.1.2017 | B      |4.1.2017
6.1.2017 | A      |6.1.2017
7.1.2017 | C      |7.1.2017
8.1.2017 | A      |8.1.2017
9.1.2017 | A      |8.1.2017
10.1.2017| A      |8.1.2017

ANSWER

select my_date, status,
       min(my_date) over (partition by grp, status) as begin 
from (select my_date,status ,
          row_number() over(order by my_date) 
          -row_number() over(partition by status order by my_date) as grp 
      from tbl ) t

感谢Vamsi Prabhala

2 个答案:

答案 0 :(得分:2)

使用行号方法的差异将组分配给具有相同状态的连续行。 (运行内部查询以查看此内容。)。在此之后,获取group by日期只需min次操作。

select status,min(my_date)
from (select my_date,status
      ,row_number() over(order by my_date)
       -row_number() over(partition by status order by my_date) as grp
      from tbl
     ) t 
group by grp,status

答案 1 :(得分:0)

请试一试。

SELECT status, min(my_dat)
  FROM dates
 GROUP BY status

好的,那么这个怎么样?

SELECT *
  FROM dates
 INNER JOIN 
(
    SELECT status, min(my_dat)
    FROM dates
    GROUP BY status
) sub
    ON dates.status = sub.status