我在获取数据时遇到了问题。这里有张桌子:
| ID | DDATE | STATUS |
|----|-----------------------|--------|
| 1 | 2000-01-01 01:00:00.0 | aaaaaa |
| 1 | 2000-01-01 02:00:00.0 | aaaaaa |
| 1 | 2000-01-01 03:00:00.0 | aaaaaa |
| 1 | 2000-01-01 04:00:00.0 | aaaaaa |
| 1 | 2000-02-01 05:00:00.0 | bbbbbb |
| 1 | 2000-02-01 06:00:00.0 | cccccc |
| 1 | 2000-02-01 07:00:00.0 | cccccc |
| 1 | 2000-02-01 08:00:00.0 | bbbbbb |
| 1 | 2000-02-01 09:00:00.0 | cccccc |
| 1 | 2000-02-01 10:00:00.0 | cccccc |
| 1 | 2000-02-01 11:00:00.0 | cccccc |
| 1 | 2000-02-01 12:00:00.0 | dddddd |
| 2 | 2000-01-01 13:00:00.0 | aaaaaa |
| 2 | 2000-02-01 14:00:00.0 | aaaaaa |
| 2 | 2000-02-01 15:00:00.0 | aaaaaa |
| 2 | 2000-02-01 16:00:00.0 | aaaaaa |
| 2 | 2000-03-01 17:00:00.0 | bbbbbb |
| 2 | 2000-03-01 18:00:00.0 | cccccc |
| 2 | 2000-03-01 19:00:00.0 | cccccc |
| 2 | 2000-04-01 20:00:00.0 | bbbbbb |
| 2 | 2000-04-01 21:00:00.0 | cccccc |
| 2 | 2000-04-01 22:00:00.0 | cccccc |
| 2 | 2000-04-01 23:00:00.0 | cccccc |
| 2 | 2000-04-01 23:30:00.0 | dddddd |
您需要获取每个 id 的每个状态序列的第一条(及时)记录:
| ID | DDATE | STATUS |
|----|-----------------------|--------|
| 1 | 2000-01-01 01:00:00.0 | aaaaaa |
| 1 | 2000-02-01 05:00:00.0 | bbbbbb |
| 1 | 2000-02-01 06:00:00.0 | cccccc |
| 1 | 2000-02-01 08:00:00.0 | bbbbbb |
| 1 | 2000-02-01 09:00:00.0 | cccccc |
| 1 | 2000-02-01 12:00:00.0 | dddddd |
| 2 | 2000-01-01 13:00:00.0 | aaaaaa |
| 2 | 2000-03-01 17:00:00.0 | bbbbbb |
| 2 | 2000-03-01 18:00:00.0 | cccccc |
| 2 | 2000-04-01 20:00:00.0 | bbbbbb |
| 2 | 2000-04-01 21:00:00.0 | cccccc |
| 2 | 2000-04-01 23:30:00.0 | dddddd |
我设法只获得每个 id 的第一个状态,而丢失了重复:
SELECT ID, MIN(DDATE) dd, STATUS FROM Table1
GROUP BY ID, STATUS
ORDER BY ID, dd
请至少告诉我方向。
UPD:可重现的示例http://sqlfiddle.com/#!4/3de9e/1/0。
为了避免重复,这里只做一个查询是不够的,你需要一个循环。我试图在 PL\SQL 中实现这一点,但不知何故,由于缺乏经验,我遇到了很多错误。我用TSQL写了一个概念,如果我能把它翻译成Oracle,那么一切都会如其所愿
但是一个请求的解决方案,我在 Oracle g12 上检查了它,一切正常:
决定这样:
我创建了一个中间表,对所有行
Table1
进行编号(对行进行编号时,按 id 和日期排序):然后我创建了一个空的 TABLE3:
在循环中,我在那里插入了必要的行: