Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQLite如何通过group by获取值与max相关的行_Sqlite_Group By_Max_Min_Related Content - Fatal编程技术网

SQLite如何通过group by获取值与max相关的行

SQLite如何通过group by获取值与max相关的行,sqlite,group-by,max,min,related-content,Sqlite,Group By,Max,Min,Related Content,我正在PHP5.5.9中使用SQLite3 这就是我正在使用的查询 SELECT ForignKey_A, Location_ID, TimeStamp FROM Events GROUP BY ForignKey_A ORDER BY TimeStamp 我想在时间戳所在的行上获取位置ID,这是每组ForignKey A的最小值和/或最大值(如果我能同时做到这两个,那就太好了) 我想我会根据我对时间戳的排序方式得到一组中的第一个值,但它不起作用,每个组通常有2到6行 我不确定本专栏是否对此

我正在PHP5.5.9中使用SQLite3
这就是我正在使用的查询

SELECT ForignKey_A, Location_ID, TimeStamp
FROM Events
GROUP BY ForignKey_A
ORDER BY TimeStamp
我想在
时间戳
所在的行上获取
位置ID
,这是每组
ForignKey A
的最小值和/或最大值(如果我能同时做到这两个,那就太好了)

我想我会根据我对
时间戳的排序方式得到一组中的第一个值,但它不起作用,每个组通常有2到6行


我不确定本专栏是否对此有用,但
我确实有一列名为
type
,布尔值为1/0
type
将在每个
ForignKey\u A
组中存在
MIN(时间戳)
的行上=0。
同样地,
type
将在
MAX(TimeStamp)
存在于每个
ForignKey\u A
组中的行上=1。

编辑:
样本表:

╔═════════════╦═════════════╦════════════╦══════╗
║ ForignKey_A ║ Location_ID ║ TimeStamp  ║ Type ║
╠═════════════╬═════════════╬════════════╬══════╣
║           1 ║         762 ║ 1496062971 ║    0 ║
║           1 ║         427 ║ 1496063971 ║    1 ║
║           1 ║         417 ║ 1496065971 ║    0 ║
║           1 ║         123 ║ 1496072971 ║    1 ║
║           2 ║         594 ║ 1496062971 ║    0 ║
║           2 ║         427 ║ 1496072971 ║    1 ║
║           3 ║         217 ║ 1496082971 ║    0 ║
║           3 ║         356 ║ 1496092971 ║    1 ║
║           3 ║         985 ║ 1496099971 ║    0 ║
║           3 ║         789 ║ 1496162971 ║    1 ║
║           3 ║         456 ║ 1496262971 ║    0 ║
║           3 ║         123 ║ 1496362971 ║    1 ║
╚═════════════╩═════════════╩════════════╩══════╝
我想如果我这样做,我会得到相关的
Location\u ID

SELECT MIN(TimeStamp), Location_ID
FROM TableA
GROUP BY ForignKey_A
我可以从与MIN/MAX
TimeStamp
这就得到了我所需要的,我必须进行一些子选择查询,但它是有效的,但是有没有办法这样做并获得正确的
位置\u ID

SELECT MIN(TimeStamp) AS 'Begin', Location_ID AS 'Location_ID @ MIN TimeStamp',
    MAX(TimeStamp) AS 'End', Location_ID AS 'Location_ID @ MAX TimeStamp', 
    ForignKey_A
FROM TableA
GROUP BY ForignKey_A
那会是这样的

╔═════════════╦═══════╦════════════╦══════╦════════════╗
║ ForignKey_A ║ Start ║   Begin    ║ Stop ║    End     ║
╠═════════════╬═══════╬════════════╬══════╬════════════╣
║           1 ║   762 ║ 1496062971 ║  123 ║ 1496072971 ║
║           2 ║   594 ║ 1496062971 ║  427 ║ 1496072971 ║
║           3 ║   217 ║ 1496082971 ║  123 ║ 1496362971 ║
╚═════════════╩═══════╩════════════╩══════╩════════════╝

对于单个查询,无法将列值与MIN()/MAX()关联。 您必须使用子查询查找最小值和最大值,然后将这些值合并在一起:

SELECT ForeignKey_A,
       b.TimeStamp,
       b.Location_ID,
       e.TimeStamp,
       e.Location_ID
FROM (SELECT ForeignKey_A,
             min(TimeStamp) AS TimeStamp,
             Location_ID
      FROM TableA
      GROUP BY ForeignKey_A
     ) AS b
JOIN (SELECT ForeignKey_A,
             max(TimeStamp) AS TimeStamp,
             Location_ID
      FROM TableA
      GROUP BY ForeignKey_A
     ) AS e
USING (ForeignKey_A);

对于单个查询,无法将列值与MIN()/MAX()关联。 您必须使用子查询查找最小值和最大值,然后将这些值合并在一起:

SELECT ForeignKey_A,
       b.TimeStamp,
       b.Location_ID,
       e.TimeStamp,
       e.Location_ID
FROM (SELECT ForeignKey_A,
             min(TimeStamp) AS TimeStamp,
             Location_ID
      FROM TableA
      GROUP BY ForeignKey_A
     ) AS b
JOIN (SELECT ForeignKey_A,
             max(TimeStamp) AS TimeStamp,
             Location_ID
      FROM TableA
      GROUP BY ForeignKey_A
     ) AS e
USING (ForeignKey_A);

请提供一些示例数据和所需输出。(请参阅如何添加一些。)修复后,我确实找到了一个可行的解决方案,但我必须在同一个表上执行两个查询并将它们连接起来。请提供一些示例数据和所需的输出。(查看如何添加一些。)修复后,我确实找到了一个可行的解决方案,但我必须在同一个表上执行两个查询并加入它们。我可以做些什么来加快运行速度,这大约需要1秒;这是因为存储在RAM磁盘上的数据库和脚本由I5-4690K处理。这个表有328512行。通过使用
WHERE type=
ForeignKey\u A
TimeStamp
上的两列索引,我可以更快地得到大约33%。我不确定索引是什么。。。您的意思是强制
ForeignKey\u A+时间戳
是唯一的吗?从技术上讲,这可能会有冗余,但只有当
Type=0
时,但我知道
Location\u ID
ForeignKey\u a
结合使用时,索引才是唯一的。我能做些什么来加快运行速度,这大约需要1秒;这是因为存储在RAM磁盘上的数据库和脚本由I5-4690K处理。这个表有328512行。通过使用
WHERE type=
ForeignKey\u A
TimeStamp
上的两列索引,我可以更快地得到大约33%。我不确定索引是什么。。。您的意思是强制
ForeignKey\u A+时间戳
是唯一的吗?从技术上讲,这可能有冗余,但只有当
Type=0
时,但我知道
Location\u ID
ForeignKey\u a
结合使用时,索引才是唯一的。