SQLite如何通过group by获取值与max相关的行
我正在PHP5.5.9中使用SQLite3SQLite如何通过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行 我不确定本专栏是否对此
这就是我正在使用的查询
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/MAXTimeStamp
这就得到了我所需要的,我必须进行一些子选择查询,但它是有效的,但是有没有办法这样做并获得正确的位置\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
结合使用时,索引才是唯一的。