微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

MS SQL 如何将两行中的值合二为一?

如何解决MS SQL 如何将两行中的值合二为一?

如何将两行中的值合并为一行? 就像我有以下原始数据

enter image description here

我想将其转换为:

enter image description here

这甚至可以用 MS sql 实现吗?

这些是 Excel 表格,但我在 sql Server 上有真实数据

说明: 对于每个 product_group_id,我想要改变 discount_id 和 discount_id 应该有 from_discount_id 和 to_discount_id ,

对于每个 product_group_id 有一个最少两个的行,对于 product_group_id 的最后一个条目,新表中应该没有条目,因为现在发生了变化。

解决方法

这可以使用窗口函数来完成:

SELECT *
FROM
    (
    SELECT
        h.PRODUCT_GROUP_ID,h.PID,LEAD(h.CHANGE_FROM) OVER (PARTITION BY h.PRODUCT_GROUP_ID 
                                   ORDER BY h.CHANGE_FROM ASC) AS CHANGE_FROM,h.PID as FROM_PID,h.DISCOUNT_ID as FROM_DISCOUNT_ID,LEAD(h.PID) OVER (PARTITION BY h.PRODUCT_GROUP_ID 
                          ORDER BY h.CHANGE_FROM ASC) as TO_PID,LEAD(h.DISCOUNT_ID) OVER (PARTITION BY h.PRODUCT_GROUP_ID
                                  ORDER BY h.CHANGE_FROM ASC) TO_DISCOUNT_ID,ROW_NUMBER() OVER (PARTITION BY h.PRODUCT_GROUP_ID 
                           ORDER BY h.CHANGE_FROM DESC) RowNoDesc
    FROM
        ProductGroupDiscountHistory h
    ) WithNext
WHERE
    WithNext.RowNoDesc <> 1
ORDER BY
    WithNext.PRODUCT_GROUP_ID,WithNext.CHANGE_FROM 
,

这是一个如何使用lead func制作它的例子

with qq as (select id,change_from,discount_id from_discount_id,lead(discount_id) over(partition by id order by change_from) to_discount_id
           from test_t)

select * 
  from qq
 where to_discount_id is not null
 order by id
,

如果需要,您也可以不使用 LEADLAG 来执行此操作。以下语句使用 INNER JOIN 条件连接两行 if

  • 他们的PRODUCT_GROUP_ID是一样的,
  • 任一一行的 CHANGE_TO 日期比下一行的 CHANGE_FROM 日期早 1 天
  • 一行的PID比下一行的少1,更改日期分别为minmax }.

这是我从上面的数据中得到的模式。

总和

PID

产生您想要的结果。

您可以在 this db<>fiddle 中对其进行测试。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。