选择具有最大值的条目并删除指定d的其他条目

2024-09-28 03:19:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样一个数据库结构:

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这么多。所以我想不出问题所在。我会很感激你的帮助。你知道吗


Tags: textiddatetimedatereturntimeoncounter
2条回答

您可能会发现“EXISTS”条件很有用:(未经测试的查询提供一个想法)

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之间放置任何内容。见SQLite DELETE syntax

即便如此,您至少还有两个错误。你知道吗

首先,不能在DELETE中使用join。您可以用IN或EXISTS重写它(参见Deleting value using SQlite while doing an INNER JOIN

其次,您是在r.id=r.maxvalue上加入的;用sayacdeger的max加入id没有任何意义。你知道吗

解决方案应该是这样的:

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语句。你知道吗

相关问题 更多 >

    热门问题