【问题标题】:SQLite How to get row where value is related to max with group bySQLite如何通过group by获取值与最大值相关的行
【发布时间】:2017-05-29 11:50:51
【问题描述】:

我在 PHP 5.5.9 中使用 SQLite3
这是我正在使用的查询

SELECT ForignKey_A, Location_ID, TimeStamp
FROM Events
GROUP BY ForignKey_A
ORDER BY TimeStamp

我想在每组ForignKey_ATimeStamp 处于最小值和/或最大值的行上获得Location_ID(如果我能同时做到这两个,那就太好了)

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

我不确定这个专栏是否对此有用,但是
我确实有名为 type 的列,布尔值为 1/0
type will = 0 在每个 MIN(TimeStamp) 存在于每个 ForignKey_A 组中的行上。
同样,type 在每个 ForignKey_A 组中存在 MAX(TimeStamp) 的行上将 = 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_ID

SELECT MIN(TimeStamp), Location_ID
FROM TableA
GROUP BY ForignKey_A

我可以从与 MIN/MAX TimeStamp 相同的行获取数据 这让我得到了我需要的东西,我必须进行几个子选择查询,但它有效,但有没有办法做这样的事情并获得正确的 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 ║
╚═════════════╩═══════╩════════════╩══════╩════════════╝

【问题讨论】:

  • 请提供一些示例数据和您想要的输出。 (请参阅How to format SQL tables in a Stack Overflow post? 了解如何添加。)
  • 已修复,我确实找到了一个可行的解决方案,但我必须在同一张表上执行两个查询并加入它们

标签: sqlite group-by max min related-content


【解决方案1】:

对于单个查询,无法将列值与哪个 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 秒;这是由 I5-4690K 处理存储在 RAM 磁盘上的数据库和脚本。 pastebin.com/UkWinxKX 这个表有 328512 行。
  • 通过使用WHERE type = ,我的速度提高了大约 33%
  • ForeignKey_ATimeStamp 上的两列索引应该会有所帮助。
  • 我不确定索引是什么...你的意思是强制ForeignKey_A + TimeStamp 是唯一的吗?从技术上讲,可以有冗余,但只有在 Type = 0 时,但我知道 Location_IDForeignKey_A 结合将是独一无二的
  • 索引是您使用CREATE INDEX 创建的。
猜你喜欢
  • 2020-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-27
  • 1970-01-01
  • 2022-01-07
  • 2017-11-04
  • 2011-08-18
相关资源
最近更新 更多