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)
相关推荐
cuber膜拜1 小时前
jupyter使用 Token 认证登录
ide·python·jupyter
张登杰踩2 小时前
pytorch2.5实例教程
pytorch·python
codists2 小时前
《CPython Internals》阅读笔记:p353-p355
python
Change is good2 小时前
selenium定位元素的方法
python·xpath定位
Change is good2 小时前
selenium clear()方法清除文本框内容
python·selenium·测试工具
leegong231114 小时前
PostgreSQL 初中级认证可以一起学吗?
数据库
秋野酱5 小时前
如何在 Spring Boot 中实现自定义属性
java·数据库·spring boot
weisian1516 小时前
Mysql--实战篇--@Transactional失效场景及避免策略(@Transactional实现原理,失效场景,内部调用问题等)
数据库·mysql
AI航海家(Ethan)6 小时前
PostgreSQL数据库的运行机制和架构体系
数据库·postgresql·架构
大懒猫软件7 小时前
如何运用python爬虫获取大型资讯类网站文章,并同时导出pdf或word格式文本?
python·深度学习·自然语言处理·网络爬虫