pyodbc库删除MSSQL表中重复字段及排序函数ROW_NUMBER()运用

ROW_NUMBER() 是一个窗口函数,用于在 SQL 查询结果集中为每一行分配一个唯一的数字标识符。这个标识符通常用于数据排序、分组或者在结果集中标识特定行。

ROW_NUMBER() 函数的语法如下:

sql 复制代码
ROW_NUMBER() OVER (
    [PARTITION BY column1, column2, ...]
    [ORDER BY column3, column4, ...]
)
  • PARTITION BY 子句是可选的,用于将结果集按照指定的列进行分区。在每个分区中,ROW_NUMBER() 将从 1 开始为每行分配唯一标识符。
  • ORDER BY 子句也是可选的,用于指定按照哪些列对行进行排序。如果指定了 ORDER BYROW_NUMBER() 将根据排序列的顺序为每行分配唯一标识符。

举个例子,假设我们有一个名为 employees 的表,包含以下列:idnamedepartmentsalary。我们想要查询每个部门的员工按照薪资降序排列的名字和薪资,同时为每个部门的员工按照薪资排名: 在这个例子中,我们使用了 PARTITION BY 子句按照 department 对结果集进行了分区,然后使用 ORDER BY 子句按照 salary 对每个部门的员工进行排序。ROW_NUMBER() 函数为每个部门的员工分配了唯一的排名。

sql 复制代码
SELECT
    name,
    salary,
    department,
    ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) as rank
FROM
    employees
ORDER BY
    department,
    rank;

pyodbc库删除MSSQL中重复字段及排序函数ROW_NUMBER()运用

python 复制代码
import pyodbc
import warnings

import pandas as pd  # 导入pandas库

warnings.filterwarnings('ignore') #隐藏Pandas警告SQLAlchemy
# 读取Excel文件
file_path = 'C:\\Users\\Administrator\\Documents\\Employees.xlsx'
df = pd.read_excel(file_path,sheet_name="Sheet1")

print(df.info())

# 连接到MSSQL数据库
server = '127.0.0.1'
database = 'tsl'
username = 'sa'
password = 'lq8xxcc'

cnxn_string = f'DRIVER={{ODBC Driver 17 for SQL Server}};SERVER={server};DATABASE={database};UID={username};PWD={password}'
cnxn = pyodbc.connect(cnxn_string)
cursor = cnxn.cursor()

# # # 将数据行插入到MSSQL数据库中
# for index, row in df.iterrows():
#     column1 = row[0]
#     column2 = row[1]
#     column3 = row[2]
#     insert_query = f"INSERT INTO Employees (CustomerId,CustomerName,Email) VALUES (?, ?, ?)"
#     cursor.execute(insert_query, column1,column2,column3)


# ROW_NUMBER() 函数需要一个 ORDER BY 子句。
# 有时候,为了满足语法的要求,但又不需要对结果进行实际排序,可以使用 ORDER BY (SELECT 0)。

# OVER 是 SQL 中用于配合窗口函数使用的子句。它指定了窗口函数计算所涉及的数据子集,这个子集称为"窗口"(window)。
# 窗口函数执行一些计算,例如 ROW_NUMBER()、SUM()、AVG() 等,但是它们会基于整个查询结果集中定义的窗口进行操作。

# WITH CTE AS (
#     SELECT *,
#            ROW_NUMBER() OVER(PARTITION BY Column1, Column2, ... ORDER BY (SELECT 0)) AS RowNumber
#     FROM YourTable
# )
# DELETE FROM CTE WHERE RowNumber > 1;

# 首先使用一个公共表表达式(CTE)来对表中的ID进行分区并为每个分区中的每一行分配一个行号。
# 然后,它删除行号大于1的行,这意味着它只保留每个分区中的第一行,从而删除了重复的ID。
sql_del_repeat = '''
WITH CTE AS (
    SELECT CustomerId, ROW_NUMBER() OVER (PARTITION BY CustomerId ORDER BY (SELECT 0)) AS RowNum
    FROM Employees
)
DELETE FROM CTE WHERE RowNum > 1;
'''
cursor.execute(sql_del_repeat)
# 提交更改
cnxn.commit()

cursor.execute('select * from Employees')
rows=cursor.fetchall()
for row in rows:
   print("%-7s %-11s %-3s"%(row[0],row[1],row[2]))

# 关闭连接
cursor.close()
cnxn.close()

--

在Python中,你可以使用三引号('''""")来编写多行字符串。这样,你就可以在字符串中包含换行符,从而编写多行SQL语句。例如:

python 复制代码
sql_query = '''
SELECT *
FROM table_name
WHERE condition
ORDER BY some_column;
'''
cursor.execute(sql_query)

pandas读取名为data.csv的CSV文件,并将其存储为一个名为df的数据框。然后,使用**drop_duplicates方法删除重复的行**。最后,将不包含重复行的数据框保存为名为data_no_duplicates.csv的CSV文件。

python 复制代码
import pandas as pd

# 读取数据
df = pd.read_csv('data.csv')

# 删除重复行
df.drop_duplicates(inplace=True)

# 保存数据
df.to_csv('data_no_duplicates.csv', index=False)
相关推荐
FL16238631296 分钟前
基于yolov5的混凝土缺陷检测系统python源码+onnx模型+评估指标曲线+精美GUI界面
人工智能·python·yolo
立黄昏粥可温17 分钟前
Python 从入门到实战22(类的定义、使用)
开发语言·python
失心疯_202333 分钟前
006.MySQL_查询数据
数据库·sql·mysql·关系型数据库·sqlyog·mysql教程·查询语句
环能jvav大师41 分钟前
基于R语言的统计分析基础:使用SQL语句操作数据集
开发语言·数据库·sql·数据分析·r语言·sqlite
今天也要加油丫1 小时前
`re.compile(r“(<.*?>)“)` 如何有效地从给定字符串中提取出所有符合 `<...>` 格式的引用
python
骆晨学长1 小时前
基于springboot的智慧社区微信小程序
java·数据库·spring boot·后端·微信小程序·小程序
@月落1 小时前
alibaba获得店铺的所有商品 API接口
java·大数据·数据库·人工智能·学习
楠枬1 小时前
MySQL数据的增删改查(一)
数据库·mysql
goTsHgo1 小时前
从底层原理上解释 clickhouse 保证完全的幂等性
数据库·clickhouse