如何解决MS SQL 如何将两行中的值合二为一?
如何将两行中的值合并为一行? 就像我有以下原始数据
这甚至可以用 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
,
如果需要,您也可以不使用 LEAD
或 LAG
来执行此操作。以下语句使用 INNER JOIN
条件连接两行 if
- 他们的
PRODUCT_GROUP_ID
是一样的,和 -
任一一行的
CHANGE_TO
日期比下一行的CHANGE_FROM
日期早 1 天 -
或一行的
PID
比下一行的少1,更改日期分别为min
和max
}.
这是我从上面的数据中得到的模式。
总和
PID
产生您想要的结果。
您可以在 this db<>fiddle 中对其进行测试。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。