Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sqlite:选择分布在总记录上的记录_Sql_Sqlite_Select - Fatal编程技术网

Sqlite:选择分布在总记录上的记录

Sqlite:选择分布在总记录上的记录,sql,sqlite,select,Sql,Sqlite,Select,我有一个sql/sqlite问题。我需要编写一个查询,从sqlite数据库表中选择一些值。我总是希望最大返回记录数为20。如果所选记录总数超过20条,我需要选择20条均匀分布(非随机)在所有记录上的记录。同样重要的是,在日期排序时,我总是从表中选择第一个和最后一个值。这些记录应插入结果的第一个和最后一个 我知道如何在代码中实现这一点,但如果有一个sqlite查询也能做到这一点,那就太完美了 我现在使用的查询非常简单,如下所示: "SELECT value,date,valueid FROM tb

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

我知道如何在代码中实现这一点,但如果有一个sqlite查询也能做到这一点,那就太完美了

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

"SELECT value,date,valueid FROM tblvalue WHERE tblvalue.deleted=0 ORDER BY DATE(date)"
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
例如,如果我在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
我想要的结果是像这样均匀分布:

"SELECT value,date,valueid FROM tblvalue WHERE tblvalue.deleted=0 ORDER BY DATE(date)"
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
希望能解释我想要什么,谢谢

我想你想要这个:

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

像这样的东西应该适合你:

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)    

换言之,您希望选择带有日期列的行,以便该日期来自已排序的日期列表,我们从中获取每个奇数元素?并添加最后记录的元素(具有最新日期)?所有内容都限制在最多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

你说的“我需要选择20条分布在整个记录中的记录”是什么意思?我想他指的是在集合中随机的,即按随机因子排序。对不起,我不清楚,我不想要随机的。请参阅上面更新的问题。谢谢引用OP:“在日期排序时,我总是从表中选择第一个和最后一个值也很重要”谢谢,但我希望记录均匀分布,而不是随机分布。我之前不清楚,更新了我的问题。这会以奇怪的顺序返回记录。首先是最小日期,然后是最大日期,然后是中间的18。我认为它需要另一个外部查询来正确排序。@Sam:是的,没有指定,所以我跳过了它。顺序是确保返回最小和最大日期。我更新了一个外部查询,以便进行适当的排序。但这只会选择一些随机记录?