SQLite 如何使用 group by 获取值与最大值相关的行
SQLite How to get row where value is related to max with group by
我在 PHP 5.5.9
中使用 SQLite3
这是我正在使用的查询
SELECT ForignKey_A, Location_ID, TimeStamp
FROM Events
GROUP BY ForignKey_A
ORDER BY TimeStamp
我想在 TimeStamp
所在的行上获得 Location_ID
每组 ForignKey_A
中的最小值 and/or 最大值(如果我可以在曾经很棒)
我以为我会根据我的排序方式获得组中的第一个值 TimeStamp
但它不起作用,每个组通常有 2 到 6 行
我不确定此专栏是否对此有用,但是
我确实有名为 type
的列,布尔值为 1/0
type
将在每个 ForignKey_A
组中存在 MIN(TimeStamp)
的行上 = 0。
同样,type
将在每个 ForignKey_A
组中存在 MAX(TimeStamp)
的行上 = 1。
编辑:
示例 Table:
╔═════════════╦═════════════╦════════════╦══════╗
║ 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_ID
SELECT MIN(TimeStamp), Location_ID
FROM TableA
GROUP BY ForignKey_A
我可以从与 MIN/MAX TimeStamp
相同的行中获取数据
这让我得到了我需要的东西,我必须进行几个子 select 查询,但它有效,但是有没有办法做这样的事情并获得正确的 Location_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);
我在 PHP 5.5.9
中使用 SQLite3
这是我正在使用的查询
SELECT ForignKey_A, Location_ID, TimeStamp
FROM Events
GROUP BY ForignKey_A
ORDER BY TimeStamp
我想在 TimeStamp
所在的行上获得 Location_ID
每组 ForignKey_A
中的最小值 and/or 最大值(如果我可以在曾经很棒)
我以为我会根据我的排序方式获得组中的第一个值 TimeStamp
但它不起作用,每个组通常有 2 到 6 行
我不确定此专栏是否对此有用,但是
我确实有名为 type
的列,布尔值为 1/0
type
将在每个 ForignKey_A
组中存在 MIN(TimeStamp)
的行上 = 0。
同样,type
将在每个 ForignKey_A
组中存在 MAX(TimeStamp)
的行上 = 1。
编辑:
示例 Table:
╔═════════════╦═════════════╦════════════╦══════╗
║ 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_ID
SELECT MIN(TimeStamp), Location_ID
FROM TableA
GROUP BY ForignKey_A
我可以从与 MIN/MAX TimeStamp
相同的行中获取数据
这让我得到了我需要的东西,我必须进行几个子 select 查询,但它有效,但是有没有办法做这样的事情并获得正确的 Location_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);