Python 当数据更改时,如何将“增量”值重置回1?
目标 我的目标是使用Python将数据库记录插入MySQL。但我会详细解释的 这是我当前的脚本(功能齐全且工作正常):Python 当数据更改时,如何将“增量”值重置回1?,python,mysql,sql-server,Python,Mysql,Sql Server,目标 我的目标是使用Python将数据库记录插入MySQL。但我会详细解释的 这是我当前的脚本(功能齐全且工作正常): #Get data from SQL sqlCursor = mjmConnection.cursor() sqlCursor.execute("SELECT sol.id, p.id, p.code,p.description, p.searchRef1, so.number, c.code, c.name, sol.requiredQty \ FROM s
#Get data from SQL
sqlCursor = mjmConnection.cursor()
sqlCursor.execute("SELECT sol.id, p.id, p.code,p.description, p.searchRef1, so.number, c.code, c.name, sol.requiredQty \
FROM salesorderline sol JOIN \
salesorder so \
ON sol.salesorderid = so.id JOIN \
product p \
ON sol.productid = p.id JOIN \
customer c \
ON so.customerid = c.id \
WHERE so.orderdate > DATEADD(dd,-35,CAST(GETDATE() AS date));")
#Send recieved data from SQL query from above to MySQL database
print("Sending MJM records to MySQL Database")
mjmCursorMysql = productionConnection.cursor()
for x in sqlCursor.fetchall():
a,b,c,d,e,f,g,h,i = x
mjmCursorMysql.execute("INSERT ignore INTO mjm_python (id, product_id, product_code, product_description, product_weight, \
salesorder_number, customer_code, customer_name, requiredQty) VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s);", (a,b,c,d,e,f,g,h,i))
productionConnection.commit()
mjmCursorMysql.close()
sqlCursor.close()
它的作用
上述脚本执行以下操作:
IGNORE
,以防止重复的id
数字
数据如下所示:
下一步..
现在-我想添加一个列名sales\u id\u increment
。这将从1
开始,并为每个相同的saleorder\u编号
递增,当存在不同的saleorder\u编号
时,将重置回1
。所以我希望它看起来像这样:
问题
我如何做到这一点?在我的Python脚本或MySQL查询中,我需要在哪里查找?当您使用窗口函数从SQL Server中选择行时,可以获得此列
行数()
或密集列()
(如果有重复的ID):
那正是我想要的。我将对您添加的查询进行研究,非常简短!非常感谢。@LV98我在您的问题中了解到,此查询的结果中可能存在重复项,使用IGNORE将不会插入这些重复项。在这种情况下,如果行号之间有间隙,可以更改为稠密的_RANK()窗口函数。每个记录都不应该有重复的
id
号,因为它是外键。一切都很好。在我自己的时间里,我还将研究dense\u rank()
。我可以问你吗?你是在哪里学SQL的?请继续学习D
SELECT sol.id, p.id, p.code,p.description, p.searchRef1, so.number, c.code, c.name, sol.requiredQty,
ROW_NUMBER() OVER (PARTITION BY so.number ORDER BY sol.id) sales_id_increment
FROM salesorderline sol
JOIN salesorder so ON sol.salesorderid = so.id
JOIN product p ON sol.productid = p.id
JOIN customer c ON so.customerid = c.id
WHERE so.orderdate > DATEADD(dd,-35,CAST(GETDATE() AS date));