Python 选择具有最大值的条目并删除指定日期的其他条目
我有这样一个数据库结构:Python 选择具有最大值的条目并删除指定日期的其他条目,python,sql,sqlite,python-2.7,datetime,Python,Sql,Sqlite,Python 2.7,Datetime,我有这样一个数据库结构: 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之后,在一天结束的
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
我以前从未深入研究过sql。所以我想不出这个问题。我将感谢你的帮助 您可能会发现“存在”条件很有用:未经测试的查询提供了一个想法
DELETE
FROM tenant_counter
WHERE EXISTS
(SELECT rn.date, MAX(rn.sayacdeger) AS maxvalue
FROM tenant_counter rn
WHERE tenant_counter.date = rn.date
AND tenant_counter.sayacdeger = rn.maxvalue
AND rn.date IS NULL
GROUP BY rn.date)
这与Python无关 错误很可能来自SQL语句的第一行,您不应该将任何内容放在delete和from之间。看 即使如此,您至少还有两个错误 首先,您不能在删除中使用join。你可以用IN或EXISTS重写它,参见 第二,您是在r.id=r.maxvalue上加入的;把id和max of sayacdeger连在一起没有任何意义 解决方案应该是这样的:
DELETE FROM tenant_counter
WHERE EXISTS (SELECT * FROM tenant_counter AS r
WHERE r.id = tenant_counter.id AND r.date = tenant_counter.date
AND r.sayacdeger > tenant_counter.sayacdeger)
这将删除所有至少有一条记录具有较大sayacdeger的相同id和日期的记录。如果您在多个记录中具有相同的最大值,它将保留重复项。你需要为这种情况决定一种策略,不管你是想要还是只想保留一条记录
注意:我没有测试上面的SQL语句。Serban,这很酷。是的,我不知道如何将sql查询转换为sqlite。这才是真正的问题。我注意到,在你的查询中,我看不到关于如何只对当前日期执行该操作的部分。我会尝试,但我也会感谢您的帮助。执行'DELETE FROM tenant_counter WHERE EXISTS SELECT*FROM tenant_counter AS r WHERE r.id=tenant_counter.id,r.date='{xn}'和r.sayacdeger>tenant_counter.sayacdeger'。\formatxn=Today该查询只为每个条目保留最大值。正如您前面提到的,它在多个记录中保留相同最大值的副本。那么,我们如何才能为此更改或更改另一个查询?从租户计数器中删除左连接选择日期,maxsayacdeger在r.date=rn.date和r.sayacdeger=rn.maxvalue上的日期rn之前作为租户\ U计数器组的maxvalue,其中rn.date='2015-08-15''当我运行此操作时,我得到了一个操作错误:在r:syntax error@ŞansalBirbaş附近,请参见上面的编辑,给您一个开始的想法。我将尝试。但同样,在你的wuery中没有日期定义。可能不是rn.date为null,而是rn.date='2015-08-15'?@ŞansalBirbaş是的,我刚刚复制了您的查询。事实上,我可能会执行类似于WHERE rn.date<按ID从租户计数器组中选择maxdate,strftime“%Y-%m-%d”,rn.date。但这取决于您的表结构。我认为这将适用于SQLite。
DELETE FROM tenant_counter
WHERE EXISTS (SELECT * FROM tenant_counter AS r
WHERE r.id = tenant_counter.id AND r.date = tenant_counter.date
AND r.sayacdeger > tenant_counter.sayacdeger)