【问题标题】:SQLite Database selecting MAX(column) on two columns, while also selecting a Distinct value from a columnSQLite 数据库在两列上选择 MAX(column),同时还从列中选择不同的值
【发布时间】:2022-01-09 02:45:37
【问题描述】:

我正在尝试从我创建的 SQLite 数据库中选择信息(类似于此):

  Date      Time    Acc  TotalAcc  Proc  TotalProc
21-12-01 | 00:00 |  133 |     133 |  76 |       76 
21-12-01 | 01:00 |  270 |     403 | 260 |      336 
21-12-01 | 02:00 |   35 |     438 |  24 |      360
21-12-01 | 02:00 |   50 |     453 |  30 |      366 
21-12-02 | 00:00 |  113 |     113 |  89 |       89
21-12-02 | 07:00 |    2 |    1290 |   6 |     1199 
21-12-02 | 07:00 |   28 |    1316 |  17 |     1210 
21-12-02 | 07:00 |  432 |    1720 | 384 |     1577
21-12-02 | 07:00 |  502 |    2222 | 403 |     1975 

我希望收集的信息:唯一日期(每天只有 1 个),Max Time(在本例中为 07: 00 表示 21-12-01,02:00 表示 21-12-02)。

我想要用于排序的最终指标(这是我遇到问题的地方):我还想选择包含最高 TotalAcc 的行。 p>

目前,这是我用来提取数据的 SQL 逻辑:

示例 =

"SELECT DISTINCT Date, TotalAcc, TotalProc, MAX(Time) 
    FROM table_name 
    GROUP BY Date 
    ORDER BY Date DESC, MAX(Time) DESC"

df = pd.read_sql_query(example, con)
print(df)

输出

我希望从数据库中获取的数据应该看起来更像这样:

          Date TotalAcc  TotalProc  MAX(Time)
0 | 21-12-02 |      453 |      366 | 02:00
1 | 21-12-01 |     2222 |     1975 | 07:00

我在选择数据时尝试使用 MAX(TotalAcc) 而不是 TotalAcc,但它返回的数字与给定时间和日期的列中的实际最大值不同。 设置 example = 'SELECT MAX(TotalAcc) FROM table_name' 返回一个非最大值(例如 1290)。

我很抱歉没有给出一个完全可复制的例子,我从一个源中提取我的数据点,它填充了我创建的表,如下所示:

with con:
                con.execute('''
                    CREATE TABLE table_name (
                        Date TEXT,
                        Time TEXT,
                        Acc TEXT,
                        TotalAcc TEXT,
                        Proc TEXT,
                        TotalProc TEXT
                    );''')

感谢所有想法,SQL 逻辑有时似乎有点混乱。

【问题讨论】:

  • 如果最大Time的行与最大TotalAcc的行不同怎么办?
  • 以我正在使用的数据,这应该是不可能的。我按时间排序后使用df['TotalAcc'] = df.['Acc'].cumsum()。我按小时对数据进行分组,我认为问题出现在 07:00 有多个数据点的情况下(由于在给定小时内多次提取数据并将其附加到 SQLite 数据库。
  • 请发布想要的结果或解释为什么当前输出不能满足您的需求。
  • 好的,我会把它添加到原帖中。
  • TotalAcc 列定义为TEXT 很可能会给您带来问题。它应该被定义为INTEGER,否则你会得到字母顺序最大值为TotalAcc的行。检查这个:dbfiddle.uk/…

标签: python-3.x pandas sqlite


【解决方案1】:

我怀疑您希望按照以下方式进行查询:

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY Date
                                 ORDER BY Time DESC, TotalAcc DESC) rn
    FROM table_name
)

SELECT Date, Time, Acc, TotalAcc, Proc, TotalProc
FROM cte
WHERE rn = 1;

这将在每个日期返回一行,具有最大时间。如果同一日期的两行或多行也具有相同的最大时间,则将选择具有最高 TotalProc 的行。

【讨论】:

  • 太棒了,这对我来说似乎很有效。我必须在我的数据库中收集更多数据点以确认它是完美的,但它肯定回答了这个问题,谢谢!
猜你喜欢
  • 2020-01-03
  • 2017-05-06
  • 1970-01-01
  • 2021-03-30
  • 2020-09-29
  • 2021-03-02
  • 1970-01-01
  • 1970-01-01
  • 2015-05-18
相关资源
最近更新 更多