0

我有一个类似于以下的 SQLite 表:

| A | B |
_________
| e | 5 |
| f | 7 |
| a | 5 |
| n | 7 |
| g | 5 |
| d | 7 |
| i | 5 |
| j | 5 |
| e | 7 |
| v | 7 |

如何检索三个具有5列中值的B随机行和三个具有值的随机行7?我不知道 in 的值B,也不知道5ad的值7我想要 3 个随机行用于B. 结果可能不按列B值分组。它可能是这样的:

| A | B |
_________
| e | 5 |
| g | 5 |
| e | 7 |
| v | 7 |
| j | 5 |
| f | 7 |
4

2 回答 2

3

以下几乎可以满足您的要求:

select t.*
from t
where t.rowid in (select t2.rowid
                  from t t2
                  where t2.b = t.b
                  order by random()
                  limit 3
                 );

唉,子查询将针对每一行运行,所以这只是近似值,因为随机数生成器在每次执行时都会更改值。

一种解决方案是使用临时表为每一行存储一个随机数,然后可以将其用于排序。不幸的是,CTE 似乎并不能解决问题,因为这些都是在每个参考文献中重新评估的。

经过一番思考,我认为临时表可能是唯一的解决方案:

drop table if exists tempt;

create temporary table tempt as 
    select t.*, random() as rand
    from t;

select t.*
from tempt t
where t.rowid in (select t2.rowid
                  from tempt t2
                  where t2.b = t.b
                  order by rand
                  limit 3
                 );
于 2018-02-19T16:14:01.767 回答
1

您可以使用隐藏的 RowID 列来获取每个 B 值的三行,如下所示:

 SELECT A, B FROM T T1
    WHERE RowID IN (SELECT RowID FROM T T2 WHERE B = T1.B LIMIT 3);

请注意,您很可能(但不是 100% 保证)每次都获得相同的三行。如果你想以牺牲一些性能为代价获得随机行,你可以这样做:

 SELECT A, B FROM T T1
    WHERE RowID IN (SELECT RowID FROM T T2 WHERE B = T1.B ORDER BY random() LIMIT 3);
于 2018-02-19T16:24:07.203 回答