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)