所以我有一个表,该表记录了名为dbo.card_history的用户的卡号更改:
| id | name | card_no | card_state | change_time |
| 1 | Ami | 11111 | 1 | 2018-11-05 21:11:06.117 |
如果我从另一个名为dbo.card的表中修改了该用户的卡号,则dbo.card历史记录将自动生成另外2个新行,现在将如下所示:
| id | name | card_no | card_state | change_time |
| 1 | Ami | 11111 | 1 | 2018-11-05 21:11:06.117 |
| 2 | Ami | 11111 | 13 | 2018-11-05 21:11:21.953 |
| 3 | Ami | 22222 | 1 | 2018-11-05 21:11:21.953 |
基本上,它将记录旧行,但card_state为13,并生成一个新行,其中更新值和card_state为1
另外,如果我删除卡的值,它将生成一个新行,其中包含旧行的记录,但card_state为12,所以现在看起来像这样:
| id | name | card_no | card_state | change_time |
| 1 | Ami | 11111 | 1 | 2018-11-05 21:11:06.117 |
| 2 | Ami | 11111 | 13 | 2018-11-05 21:11:21.953 |
| 3 | Ami | 22222 | 1 | 2018-11-05 21:11:21.953 |
| 4 | Ami | 22222 | 12 | 2018-11-05 21:16:09.397 |
我想做的是查询,返回的内容如下:
| id | name | card_no | card_state | change_time | old_card_no |
| 1 | Ami | 11111 | 1 | 2018-11-05 21:11:06.117 | NULL |
| 2 | Ami | 22222 | 1 | 2018-11-05 21:11:21.953 | 11111 |
| 3 | Ami | 22222 | 12 | 2018-11-05 21:16:09.397 | NULL |
我想合并具有相同change_time的行,以便card_state为13的行的card_no将在称为old_card_no的新行中返回
我尝试过这样的查询:
SELECT P.id, P.name, P.card_no, P.card_state, P.change_time,
MIN(CASE WHEN P.card_state != 1 then P.card_no END) AS old_card_no
FROM [dbo].[card_history] P
GROUP BY P.pin, P.name, P.last_name, P.card_no, P.change_time, P.card_state
这将返回:
| id | name | card_no | card_state | change_time | old_card_no |
| 1 | Ami | 11111 | 1 | 2018-11-05 21:11:06.117 | NULL |
| 2 | Ami | 11111 | 13 | 2018-11-05 21:11:21.953 | 11111 |
| 3 | Ami | 22222 | 1 | 2018-11-05 21:11:21.953 | NULL |
| 4 | Ami | 22222 | 12 | 2018-11-05 21:16:09.397 | 22222 |
对不起,我是一个新手,我意识到这里一定缺少明显的东西,但是我已经坚持了很长时间,需要帮助; m;
答案 0 :(得分:1)
一种相当简单的方法是使用子查询:
SELECT id, name, card_no, card_state, change_time,
(select card_no
from [dbo].[card_history] t1
where card_state = 13
and t0.name = t1.name
and t0.change_time = t1.change_time
) as old_card_no
FROM [dbo].[card_history] t0
WHERE card_state != 13
答案 1 :(得分:0)
如果我没听错,您想合并与某些列名匹配的2行,为此,您可以将GROUP BY与Max或Min结合使用,例如:“ SELECT ex1,ex2,Max(change_time)作为change_time,... .. FROM表GROUP BY的东西”