【问题标题】:Sqlite: Selecting records spread over total recordsSqlite:选择分布在总记录上的记录
【发布时间】:2010-04-28 13:23:07
【问题描述】:

我有一个 sql / sqlite 问题。我需要编写一个从 sqlite 数据库表中选择一些值的查询。我总是希望最大返回记录为 20。如果选择的记录总数超过 20,我需要选择 20 条均匀分布(非随机)的记录。同样重要的是,当按日期排序时,我总是从表中选择第一个和最后一个值。这些记录应该在结果中最先和最后插入。

我知道如何在代码中完成此操作,但最好有一个可以执行相同操作的 sqlite 查询。

我现在使用的查询非常简单,如下所示:

"SELECT value,date,valueid FROM tblvalue WHERE tblvalue.deleted=0 ORDER BY DATE(date)"

例如,如果我在 talbe 中有这些记录,并且为了更简单的示例,我想要的最大结果是 5。

id    value    date
 1     10       2010-04-10
 2      8       2010-04-11
 3      8       2010-04-13
 4      9       2010-04-15
 5     10       2010-04-16
 6      9       2010-04-17
 7      8       2010-04-18
 8     11       2010-04-19
 9      9       2010-04-20
 10    10       2010-04-24

我想要的结果是这样均匀分布的:

id    value    date
 1     10       2010-04-10
 3      8       2010-04-13
 5     10       2010-04-16
 7      8       2010-04-18
 10    10       2010-04-24

希望能解释一下我想要什么,谢谢!

【问题讨论】:

  • “我需要选择分布在全部记录中的 20 条记录”是什么意思?
  • 我认为他的意思是在集合上随机化,即按随机因子排序
  • 抱歉,我不是很清楚,我不想要随机的。请参阅上面的更新问题。谢谢!

标签: sql sqlite select


【解决方案1】:

这样的东西应该适合你:

SELECT *
FROM (
    SELECT v.value, v.date, v.valueid 
    FROM tblvalue v
    LEFT OUTER JOIN (
        SELECT min(DATE(date)) as MinDate, max(DATE(date)) as MaxDate
        FROM tblvalue 
        WHERE tblvalue.deleted = 0 
    ) vm on DATE(v.date) = vm.MinDate or DATE(v.date) = vm.MaxDate
    WHERE tblvalue.deleted = 0 
    ORDER BY vm.MinDate desc, Random()
    LIMIT 20
) a
ORDER BY DATE(date)    

【讨论】:

  • 这会以奇怪的顺序返回记录。首先是最小日期,然后是最大日期,然后是中间的 18。我认为它需要另一个外部查询才能正确排序。
  • @Sam:是的,没有指定,所以我跳过了。该顺序是为了确保返回最小和最大日期。我更新为包含正确排序的外部查询。
  • 但这只会选择一些随机记录?
【解决方案2】:

我想你想要这个:

SELECT value,date,valueid FROM tblvalue WHERE tblvalue.deleted=0 
ORDER BY DATE(date), Random()
LIMIT 20

【讨论】:

  • 引用 OP:“在按日期排序时,我始终从表中选择第一个和最后一个值也很重要”
  • 谢谢,但我希望记录均匀分布,而不是随机分布。我之前不清楚,更新了我的问题。
【解决方案3】:

换句话说,您希望选择带有日期列的行,以便日期来自已排序的日期列表,我们从哪里获取每个奇数元素?并添加最后记录的元素(最新日期)?一切都限制在最多 20 行?

如果是这样的话,那么我认为应该这样做:

SELECT id,value,date FROM source_table WHERE date IN (SELECT date FROM source_table WHERE (rowid-1) % 2 = 0 OR date = (SELECT max(date) FROM source_table) ORDER BY date) LIMIT 20

【讨论】:

    猜你喜欢
    • 2014-04-08
    • 2019-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-16
    • 1970-01-01
    相关资源
    最近更新 更多