你好,感谢您花时间回答我的问题。我在一个小城市的预算部门工作,在这个不稳定的时期,我正在学习一些 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]
问题/最佳实践
例如?开始元代码*****
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],我可能会添加一个条件以退出,但我仍然不确定这是否是解决此问题的正确方法。这将每年仅运行一两次,因此系统性能并不那么重要,但我仍在考虑以正确的方式解决它。
您可以使用exists来检查同一天是否存在另一条记录,且其值是其两倍,并使用窗口函数来筛选每天的顶级记录:
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(),另一个选项是使用相关子查询进行过滤:
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)