Python 将组转换为sql(ite):组中的限制 问题

Python 将组转换为sql(ite):组中的限制 问题,python,sql,pandas,sqlite,Python,Sql,Pandas,Sqlite,我正在尝试将pandas查询转换为SQLite查询。我将其转换为SQL的主要问题是试图在组中设置限制 下面是一个示例数据库的python设置 导入sqlite3 从随机导入选择 作为pd进口熊猫 df=pd.DataFrame 字典 montecarlo=选择范围1501,k=10_000, 时间=选择范围1,1_000,k=10_000, 跟踪id=选项[1,2,3],k=10,000, 通过=选择[正确,错误],k=10_000, df.sort_valuesby=[montecarlo,t

我正在尝试将pandas查询转换为SQLite查询。我将其转换为SQL的主要问题是试图在组中设置限制

下面是一个示例数据库的python设置

导入sqlite3 从随机导入选择 作为pd进口熊猫 df=pd.DataFrame 字典 montecarlo=选择范围1501,k=10_000, 时间=选择范围1,1_000,k=10_000, 跟踪id=选项[1,2,3],k=10,000, 通过=选择[正确,错误],k=10_000, df.sort_valuesby=[montecarlo,time],inplace=True conn=sqlite3.connecttest.db df.to_sqlmytable,conn,index=False,如果_存在=替换 所以我要用熊猫写的问题是

将numpy作为np导入 def first_time_如果存在sdf:pd.DataFrame->float: 尝试: 返回df.loc[df.passed.eq1].time.iloc[0] 除索引器外: 有时给定的df没有通行证 返回np.NaN 结果= df.groupby[montecarlo,跟踪_id]按montecarlo和id分组 .applyfirst\u time\u如果存在,则获取每组的首次通过时间 .重新命名首次为熊猫系列命名 .重置\u索引Pop montecarlo并将\u id跟踪回正常列 结果是这样的

蒙地卡罗第一次跟踪id 0 1 1 51.0 1 1 2 289.0 2 1 3 14.0 3 2 1 201.0 4 2 2 121.0 ... ... ... ... 1492 499 2 143.0 1493 499 3 129.0 1494 500 1 25.0 1495 500 2 147.0 1496 500 3 251.0 [1497行x 3列] 到目前为止我都试过了 我想我已经能够通过我的SQL查询实现大部分功能

选择 蒙特卡洛,追踪id,时间 从…起 空白表 哪里 通过=1 分组 蒙地卡罗,追踪id; 然而,这给了我每个小组的所有时间,而不仅仅是第一次。我也试过了

选择 蒙特卡洛,追踪id,时间 从…起 空白表 哪里 通过=1 限度 1. 分组 蒙地卡罗,追踪id;
但是我限制的地方是非法语法。

在任何关系数据库中,所有表都是无序集,因此没有第一行或最后一行。 所以这部分代码:

.apply(first_time_if_exists)  # Get time of first pass for each group
在SQL中没有意义,除非有一列表示行的顺序,比如自动递增的id或带有插入行的时间戳的datetime列

SQLite为所有表提供了可用于此目的的列,但并不总是保证其最大值将是最后插入的行,因为删除行后,可能会重用缺少的rowids值

如果您可以使用这样一个列,比如ordercolumn,那么您可以使用以下内容:

SELECT montecarlo, tracking_id, time
FROM mytable
WHERE passed = 1
GROUP BY montecarlo, tracking_id
HAVING MIN(ordercolumn)
此查询虽然在其他数据库中无效,但在SQLite中有效,并为montecarlo和tracking_id的每个组合返回ordercolumn值最小的行。 您可以使用我已经提到的限制下的列rowid,或者设置行顺序的任何其他列来代替ordercolumn

您也可以使用FIRST_VALUE window函数执行相同的操作:

SELECT DISTINCT montecarlo, tracking_id, 
       FIRST_VALUE(time) OVER (PARTITION BY montecarlo, tracking_id ORDER BY ordercolumn) AS time
FROM mytable
WHERE passed = 1

在这个问题上做得很好,但是我不清楚你说的“这给了我每个小组所有的时间”是什么意思。你每次都有一次,追踪身份证组合,对吗?此外,在使用随机模块时,设置种子可能会有所帮助,以便您和其他人可以复制您的测试集,例如random.seed1感谢您提供详细答案!第一种价值方法是我不知道存在的东西。多个例子非常简单helpful@natemcintosh从3.25.0版开始,您可以在此处了解SQLite的窗口函数支持: