操作完全相同多行数据中某些行

本文介绍了如何在 SQL Server 中处理和优化数据,包括通过物理地址定位数据行、删除重复数据以及更新数据的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

架设有如下数据:

DECLARE @tb TABLE (col1 INT,col2 VARCHAR(100))
INSERT INTO  @tb VALUES (10,'a'), (11,'b'), (10,'a'), (10,'a'), (10,'a'), (10,'a'), (10,'a'), (11,'b')
SELECT * FROM @tb
col1col2
10a
11b
10a
10a
10a
10a
10a
11b

如果想更新或删除上面数据中的某些行,那么无法直接用Where指定条件。
可以将数据临时增加一个需要列再处理。
其实不用额外处理数据,利用SQL 内部数据存储的物理地址也可以定位某行数据。
在SQL Server 2005里可以通过%%lockres%%得到数据行对应的物理路径信息,在SQL Server2008里还可以通过%%physloc%% 得到,用sys.fn_PhysLocFormatter 将得到的binary数据转换后就是%%lockres%% 的值。
注意上面的是 Undocumented Function,使用有风险,sys.fn_PhysLocFormatter还有个bug

SELECT %%Physloc%% AS Addr,sys.fn_PhysLocFormatter(%%Physloc%%) AS rowid , * FROM @tb
Addrrowidcol1col2
0x2008000003000000(3:2080:0)10a
0x2008000003000100(3:2080:1)11b
0x2008000003000200(3:2080:2)10a
0x2008000003000300(3:2080:3)10a
0x2008000003000400(3:2080:4)10a
0x2008000003000500(3:2080:5)10a
0x2008000003000600(3:2080:6)10a
0x2008000003000700(3:2080:7)11b

假设现在要求重复的数据仅留一行,那么就可以利用地址来标识。
按如下执行后将仅余两行数据

DELETE t1 FROM @tb AS t1
INNER JOIN  (SELECT  col1,col2,MAX(%%Physloc%%)  as maxIndex FROM @tb GROUP BY col1,col2) t2  ON t1.col1=t2.col1 AND t1.col2=t2.col2
WHERE (t1.%%Physloc%%)!=t2.maxIndex

执行后:

SELECT  * FROM @tb
col1col2
10a
11b
### 使用 Pandas DataFrame 合并单元格 在处理表格数据时,有时需要合并具有相同值的相邻。Pandas本身并不直接提供用于合并的功能,但可以通过自定义方法实现这一目标。 对于简单的重复项删除操作可以使用 `drop_duplicates` 方法来移除完全相同[^1]: ```python import pandas as pd data = {'A': ['foo', 'bar', 'foo', 'bar'], 'B': ['one', 'one', 'two', 'three']} df = pd.DataFrame(data) # 删除列 A 和 B 上有重复值的 result_df = df.drop_duplicates() ``` 然而当涉及到更复杂的场景比如跨多行合并特定条件下的单元格,则可能需要用到groupby结合agg函数的方式[^2]: ```python def merge_consecutive_rows(df, column_name): """ 将连续相等的按照指定列进合并 参数: df (pd.DataFrame): 输入的数据框. column_name (str): 要检查是否连续相等的列名. 返回: merged_df (pd.DataFrame): 处理后的数据框. """ # 创建一个新的布尔列表表示当前元素与其前一个不同之处 mask = df[column_name].ne(df[column_name].shift()) # 对于每一个分组应用聚合操作 grouped = df[mask].groupby((~mask).cumsum()).agg({column_name:'first'}) return grouped.reset_index(drop=True) example_data = { "Category": ["X", "X", "Y", "Z"], "Value": [10, 15, 7, 9], } example_df = pd.DataFrame(example_data) merged_example_df = merge_consecutive_rows(example_df, "Category") print(merged_example_df) ``` 上述代码展示了如何通过创建辅助掩码以及利用累计求和(`cumsum`)技巧来进基于给定条件下对DataFrame的某些合并动作[^3].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值