SQLite:添加包含行位置的列
我有一个SQLite表,需要添加一列,其中包含SELECT指令给定的行位置。 SELECT指令包含两个order子句 如果不清楚,以下是一个示例: 鉴于这些数据:SQLite:添加包含行位置的列,sql,sqlite,Sql,Sqlite,我有一个SQLite表,需要添加一列,其中包含SELECT指令给定的行位置。 SELECT指令包含两个order子句 如果不清楚,以下是一个示例: 鉴于这些数据: id | c1 | c2 =============================== a | 1 | 2 b | 1 | 3 c | 1 | 1 d | 2 | 2
id | c1 | c2
===============================
a | 1 | 2
b | 1 | 3
c | 1 | 1
d | 2 | 2
e | 2 | 3
f | 2 | 1
此查询:
SELECT * FROM table ORDER BY c1, c2
我需要这个结果表:
id | c1 | c2 | position
=========================================
a | 1 | 2 | 2
b | 1 | 3 | 3
c | 1 | 1 | 1
d | 2 | 2 | 5
e | 2 | 3 | 6
f | 2 | 1 | 4
我怎么做
重要提示:
这不是实际数据,甚至不是实际列。这只是一个例子 此查询应提供您要查找的所有字段:
现在,要按ID订购:
注释
如果内部ORDERBY不起作用,您可以将中间结果转储到临时表中,然后使用最终ORDERBY子句从临时表中进行选择。
上面的1000是一个系数。您需要确保该系数大于c2的最大值,但不会太高,导致整数溢出。
替代方法
您可以插入到具有自动增量列的临时表中,然后根据所需顺序从该临时表中选择值
考虑到这些数据,你可以得到c1-1*3+c2的位置值。这样行吗?我看不出有任何理由在给定任何特定数据集的情况下使用最小可能系数3。在重叠/错误排序风险最小值和可能导致溢出的值之间的一半如何?
SELECT
( SELECT COUNT(0)
FROM MyTable T1
WHERE (T1.c1 * 1000) + T1.c2 <= (T2.c1 * 1000) + T2.c2
) as 'position',
c1,
c2,
ID
FROM
MyTable T2
ORDER BY
(c1 * 1000) + c2
SELECT ID, c1, c2, position FROM
(SELECT
(SELECT COUNT(0)
FROM MyTable T1
WHERE (T1.c1 * 1000) + T1.c2 <= (T2.c1 * 1000) + T2.c2
) as 'position',
c1,
c2,
ID
FROM
MyTable T2
ORDER BY
(c1 * 1000) + c2
) T3
ORDER BY ID