sql one查询为所选标识符选择最大/最小值(每个标识符都有某种类型?)
我有简单的sql结构:sql one查询为所选标识符选择最大/最小值(每个标识符都有某种类型?),sql,sqlite,Sql,Sqlite,我有简单的sql结构: CREATE TABLE main_tbl( id INTEGER PRIMARY KEY ASC, start_time TEXT NOT NULL, ); CREATE TABLE second_tbl ( id INTEGER PRIMARY KEY AUTOINCREMENT, data BL
CREATE TABLE main_tbl(
id INTEGER PRIMARY KEY ASC,
start_time TEXT NOT NULL,
);
CREATE TABLE second_tbl (
id INTEGER PRIMARY KEY AUTOINCREMENT,
data BLOB,
m_id INTEGER NOT NULL,
FOREIGN KEY(m_id) REFERENCES main_tbl(id) ON DELETE CASCADE
);
CREATE INDEX m_id_idx ON second_tbl (m_id);
CREATE INDEX start_time_idx ON main_tbl (start_time);
并想从main\u tbl
中查找一些项目:
通过开始时间描述限制X偏移量Y从主订单选择id、开始时间代码>
然后对于所选的main_tbl.id
find min/max集合:
SELECT data FROM second_tbl WHERE m_id=chosen_id AND SOME_CONDITION ORDER BY second_tbl.id ASC LIMIT 1
UNION
SELECT data FROM second_tbl WHERE m_id=chosen_id AND SOME_CONDITION ORDER BY second_tbl.id DESC LIMIT 1
在伪语言上,它如下所示:
foreach chosen_id IN (SELECT id,start_time FROM main_tbl ORDER BY start_time DESC LIMIT X OFFSET Y)
SELECT data FROM second_tbl WHERE m_id=chosen_id AND SOME_CONDITION ORDER BY second_tbl.id ASC LIMIT 1
UNION
SELECT data FROM second_tbl WHERE m_id=chosen_id AND SOME_CONDITION ORDER BY second_tbl.id DESC LIMIT 1
但是如何在一个SQL查询中编写它(实际上是SQL的sqlite子集)
如果我写:
WITH chosen_ids(id,data) AS (SELECT id,start_time FROM main_tbl ORDER BY start_time DESC LIMIT X OFFSET Y)
SELECT data FROM second_tbl WHERE m_id IN (SELECT id from chosen_ids) AND SOME_CONDITION ORDER BY second_tbl.id ASC LIMIT 1
然后,我为所有选定的\u id
获取mininim,而我需要为每个id获取mininim
如果我使用JOIN
而不是WITH
,我只能为整个连接查询设置LIMIT/OFFSET
,而不仅仅是SELECT
frommain\u tbl
更新
示例数据:
sqlite>SELECT id,通过start\u time DESC LIMIT 5 OFFSET 100从主订单开始计时;
900 | 2019-03-14T08:36:26.324937205+00:00
899 | 2019-03-14T06:36:26.324937205+00:00
898 | 2019-03-14T04:36:26.324937205+00:00
897 | 2019-03-14T02:36:26.324937205+00:00
896 | 2019-03-14T00:36:26.324937205+00:00
然后我运行了896-900的子查询,下面是900的示例:
sqlite>从second_-tbl中选择quote(数据),其中m_-id=900,并且数据不是second_-tbl.id ASC LIMIT 1的空顺序;
X'00000000 8A128A5C00000000F5255E130000000000000F03F0000000000000040000000000000840000000000000104000000000000000000000001440010000000000001840'
sqlite>从second_tbl中选择quote(data),其中m_id=900,并且数据不为空,顺序为second_tbl.id DESC LIMIT 1;
X'00000000 AA2E8A5C00000000F54468000000000000000000000000F03F000000000000004000000000000084000000000000010400000000000000000000000000001440010000000000001840'
好吧,您可以使用以下命令将其编写为一个查询:
SELECT m.id, m.start_time, MIN(s.data) as min_data, MAX(s.data) as max_data
FROM main_tbl m LEFT JOIN
second_tbl s
ON s.m_id = m.id
GROUP BY m.id
ORDER BY start_time DESC
LIMIT X OFFSET Y;
编辑:
可以使用相关子查询:
SELECT m.id, m.start_time,
(SELECT s.data FROM second_tbl s WHERE m.m_id = s.chosen_id AND SOME_CONDITION ORDER BY s.id ASC LIMIT 1) as min_data,
(SELECT s.data FROM second_tbl s WHERE m.m_id = s.chosen_id AND SOME_CONDITION ORDER BY s.id DESC LIMIT 1) as max_data
FROM main_tbl m
ORDER BY start_time DESC
LIMIT X OFFSET Y;
示例数据和所需结果将非常有用。@GordonLinoff我用示例数据更新我的问题我不需要MIN作为数据,请参阅我按秒顺序执行ASC/DESC LIMIT 1
加上对于最小/最大搜索,我只选择一些行(这是某些条件
),但这可能并不重要。让我考虑一下。谢谢,但是出于某种原因,第二个查询为每一行返回相同的m.id
?我将m.m\u id=s.selected\u id
替换为m.id=s.m\u id
,并运行您的查询,但由于某些原因,它报告的X(限制)
次数相同m.id