小能豆

Sqlite db 上 Python 中的行排序和选择逻辑

py

你好,感谢您花时间回答我的问题。我在一个小城市的预算部门工作,在这个不稳定的时期,我正在学习一些 Python,也许将来可以帮助我进行一些财务数据建模。我们目前使用 SAP,但我也想学习一门新语言。

我需要一些关于在哪里寻找某些答案的指示。例如,我创建了一个包含几百万条记录的数据库,按日期和时间排序。我能够删除不需要的数据,现在有一个干净的数据库可供使用

从高层次上讲,我想知道是否基于一天中的第一个记录,同一天是否有另一个是第一个记录两倍的条目。

Date|time|dept|Value1
01/01/2019|11:00|BUD|51.00
01/01/2019|11:30|CSD|101.00
01/01/2019|11:50|BUD|102.00
01/02/2019|10:00|BUD|200.00
01/02/2019|10:31|BUD|201.00
01/02/2019|11:51|POL|400.00
01/03/2019|11:00|BUD|100.00
01/03/2019|11:30|PWD|101.00
01/03/2019|11:50|BUD|110.00

根据以上数据和要求,我希望得到以下输出

Date|time|dept|Value| Start Value
01/01/2019|11:50|BUD|102.00|51.00
01/02/2019|11:51|POL|400.00|200.00
01/03/2019|NONE|NONE|NONE|100.00

第三天,没有至少两倍的值,因此,我们没有或为空。

我目前所做的

我已经能够连接到数据库 [python] 2. 我能够从数据库 [sqlite] 中删除不必要的信息和部门 3. 我已经能够为结果创建新表 [Python]

问题/最佳实践

  1. 如何获取每天的第一行。我是否先从循环前的变量开始,将其分配给 2019 年 1 月 1 日,然后选择行号并将其存储在另一个表中,或者我们这里还有哪些其他选项。
  2. 一旦每天的第一行被存储/捕获到另一个表或数组中,我如何获得第一行至少两次出现的值的第一次出现。

例如?开始元代码*****

Start from Line 1 to end
table2.date[] Should be equal to 01/01/2019
table2.value[] Should be equal to 51.00
look through each line if date = table2.date and value >= 2* (table2.value[])
*if successful, get record line number and department and value and store in new table
else
goto next line

Then increase table2.date and table2.value by 1 and do the loop again. 

结束元代码****

这是正确的方法吗?我觉得每次日期改变都要浏览数百万条记录并不是很优化。

如果日期不等于 table2.date[1],我可能会添加一个条件以退出,但我仍然不确定这是否是解决此问题的正确方法。这将每年仅运行一两次,因此系统性能并不那么重要,但我仍在考虑以正确的方式解决它。

  1. 我是否应该将最终数据导出到 Excel 进行分析,或者 Python 中是否有好的分析建模工具。专业人士会推荐什么?

阅读 15

收藏
2025-01-07

共1个答案

小能豆

您可以使用exists来检查同一天是否存在另一条记录,且其值是其两倍,并使用窗口函数来筛选每天的顶级记录:

select *
from (
    select 
        t.*,
        row_number() over(partition by date order by time) rn
    from mytable t
    where exists (
        select 1 from mytable t1 where t1.date = t.date and t1.value = 2 * t.value
    )
) t
where rn = 1

在不可用的 SQLite 版本中row_number(),另一个选项是使用相关子查询进行过滤:

select t.*
from mytable t
where 
    exists(select 1 from mytable t1 where t1.date = t.date and t1.value = 2 * t.value)
    and t.time = (select min(t1.time) from mytable t1 where t1.date = t.date)
2025-01-07