繁体   English   中英

合并特定列中具有相同值的行

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM