将结果限制为x组

时间:2013-06-21 10:09:13

标签: sql grouping limit trac

我正在使用Trac开发一个系统,我想限制返回的“changelog”条目的数量。问题是Trac使用union从多个表中整理这些条目,然后根据它们的时间戳将它们组合成单个“变更集”。我希望将结果限制在最新状态,例如3个更改集,但这需要根据需要检索尽可能多的行,直到我有3个唯一的时间戳。解决方案需要适用于SQLite / Postgres。

Trac's current SQL

当前SQL结果

Time                User  Field         oldvalue   newvalue   permanent
=======================================================================
1371806593507544    a     owner         b         c           1
1371806593507544    a     comment       2         lipsum      1
1371806593507544    a     description   foo       bar         1
1371806593324529    b     comment       hello     world       1
1371806593125677    c     priority      minor     major       1
1371806592492812    d     comment       x         y           1

预期的SQL结果(限于1个时间戳,例如。)

Time                User  Field         oldvalue   newvalue   permanent
=======================================================================
1371806593507544    a     owner         b         c           1
1371806593507544    a     comment       2         lipsum      1
1371806593507544    a     description   foo       bar         1

2 个答案:

答案 0 :(得分:1)

正如您已经自己指出的那样,由于结果数量不确定,因此无法在SQL中解决此问题。而且我认为这甚至都不需要。

您可以使用稍加修改的trac/ticket/templates/ticket.html Genshi模板来获得您想要的内容。变化

      <div id="changelog">
        <py:for each="change in changes">

      <div id="changelog">
        <py:for each="change in changes[-3:]">

并将文件放入<env>/templates/重启您的网络服务器。但是,每当您尝试升级Trac安装时,请注意ticket.html的更改。每次执行此操作时,您可能需要在相应版本的当前模板上重新应用此更改。但恕我直言,它仍然比修补Trac核心代码更快更干净。

答案 1 :(得分:0)

如果您只想要三条记录(如“数据限制1”结果集),则可以使用limit

select *
from t
order by time desc
limit 3

如果您想要三张最新时间戳的所有记录,可以使用连接:

select t.*
from t join
     (select distinct time
      from t
      order by times desc
      limit 3
     ) tt
     on tt.time = t.time