【问题标题】:I'm looking for a "soft" limit on this database query我正在寻找对此数据库查询的“软”限制
【发布时间】:2013-02-12 19:50:46
【问题描述】:

我有这个数据库查询:

SELECT * FROM Events e 
   WHERE e.TimestampTicks >= @StartTicks 
   ORDER BY e.TimestampTicks 
   LIMIT @Limit

@StartTicks@Limit是传入的变量。

我需要查询的行为有所不同。我希望@Limit 是最低限度的。对于任何给定的 TimestampTicks 值(一个 64 位有符号整数),我需要该值的所有行。我不能拆分任何一组 TimestampTicks。如何修改查询以实现这一点?

【问题讨论】:

    标签: sql sqlite group-by


    【解决方案1】:

    下面是你想要的。

    SELECT *
    FROM Events e
    WHERE e.TimestampTicks between @StartTicks 
      AND (SELECT MAX(TimestampTicks)
                                  FROM
                                  (
                                    SELECT TimestampTicks 
                                    FROM Events 
                                       WHERE TimestampTicks >= @StartTicks 
                                       ORDER BY TimestampTicks 
                                       LIMIT @Limit
                                  )emax
                             )
    ORDER BY e.TimestampTicks
    

    【讨论】:

    • TimestampTicks 列上有一个索引。您期望 MAX 会使用该索引吗?即使内部查询中没有 ORDER BY,您是否期望 MAX 会使用该索引?
    • 如果有索引,它可能。但如果没有,@Gordon Linoff 的解决方案会更好。除了如何获取 max 之外,这两个查询几乎都是准确的。
    【解决方案2】:

    您是否要查找大于 @StartTicks 的 TimestampTicks 的第一个值,然后返回与该值匹配的所有行?如果是这样,你会这样做:

    SELECT e1.*
      FROM Events e1
      JOIN (SELECT MIN(TimestampTicks) AS TimestampTicks
              FROM Events e2
             WHERE TimestampTicks >= @StartTicks) e2
        ON e1.TimestampTicks = e2.TimestampTicks
    

    此外,由于您要提取所有匹配的记录,我认为不需要 ORDER BY。

    【讨论】:

      【解决方案3】:

      计算您要查找的阈值,然后使用where 子句获取结果:

      select *
      from Events e
      where e.TimestampTicks between @StartTicks and
               (select TimestampTicks 
                 from (SELECT *
                       FROM Events e 
                       WHERE e.TimestampTicks >= @StartTicks 
                       ORDER BY e.TimestampTicks 
                       LIMIT @Limit
                      ) t
                 order by TimestampTicks desc
                 limit 1
                )
      

      这通过获取满足条件的最内层子查询中的@LIMIT 行数来工作。然后它以 other 方式命令它们,以获得TimestampTicks 的限制值)。 (我也可以为此使用select max(TimestampTicks)。)然后将此阈值用作where 条件。

      【讨论】:

      • 你几乎是对的。您只是忘记放回“e.TimestampTicks >= @StartTicks”。这是起点。
      • @OsaE 。 . .该行位于最里面的子查询中。那是起点。
      • 我明白了。但是最外层的查询是从整个表中获取数据,然后只通过内部查询返回的最大值进行过滤。我测试了你的查询sqlfiddle.com/#!9/95f48/18/0
      • @OsaE 。 . .我明白你的意思了。它是“介于”查询,而不仅仅是“顶部”查询。
      • 您的更新是正确的。我将使用 between 重写我的。它更干净。
      猜你喜欢
      • 2011-03-04
      • 1970-01-01
      • 1970-01-01
      • 2011-01-22
      • 1970-01-01
      • 2019-08-26
      • 2015-05-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多