我有这样一个数据库结构:
CREATE TABLE `tenant_counter` (
`id` TEXT,
`date` TEXT,
`time` TEXT,
`date_time` TEXT,
`sayacdeger` REAL,
PRIMARY KEY(id,date_time)
);
我的applıcatıon每天为每个id存储24个sayacdeger。我需要做的是在收集完所有的sayacdeger之后,在一天结束的23:00之后,保留sayacdeger最大值的条目,并删除当天的其他条目。为此,我写道:
def sadelestir():
threading.Timer(3600, sadelestir).start()
sadelestirme_time = datetime.datetime.now()
if (sadelestirme_time.hour<23):
return
print "Sayaclari sadelestiriyor"
# Connecting to the database file
conn2 = sqlite3.connect('tenantdata.sqlite')
c2 = conn2.cursor()
c2.execute('''delete r
from tenant_counter r left join
(select date, max(sayacdeger) as maxvalue
from tenant_counter
group by date
) rn
on r.date = rn.date and r.sayacdeger = rn.maxvalue
where rn.date is null''')
conn2.commit()
conn2.close()
return
运行此代码时,出现语法错误:
where rn.date is null''')
OperationalError: near "r": syntax error
我以前从未涉足sql这么多。所以我想不出问题所在。我会很感激你的帮助。你知道吗
您可能会发现“EXISTS”条件很有用:(未经测试的查询提供一个想法)
这与Python无关。你知道吗
错误很可能来自SQL语句的第一行,您不应该在delete和from之间放置任何内容。见SQLite DELETE syntax
即便如此,您至少还有两个错误。你知道吗
首先,不能在DELETE中使用join。您可以用IN或EXISTS重写它(参见Deleting value using SQlite while doing an INNER JOIN)
其次,您是在r.id=r.maxvalue上加入的;用sayacdeger的max加入id没有任何意义。你知道吗
解决方案应该是这样的:
这将删除所有至少有一个具有较大sayacdeger的相同id和日期的记录。如果在多个记录中有相同的最大值,它将保留重复项。你需要为那个案子决定一个策略,不管你是想要那个还是只想保留一个记录。你知道吗
注意:我没有测试上面的SQL语句。你知道吗
相关问题 更多 >
编程相关推荐