[英]Merge rows with same value in a specific column
所以我有一个表,记录了一个名为 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;
一种相当简单的方法是使用子查询:
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
如果我没听错,您想合并与特定列名匹配的 2 行,为此您可以使用 GROUP BY 和 Max 或 Min,例如:“SELECT ex1,ex2,Max(change_time) as change_time,..... FROM表 GROUP BY 东西”
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.