If you want it fast even for huge tables then force the creation of an index on
the temporary rotate table:
begin immediate;
create temporary table rotate as
select oldkey,
newkey,
(select value from x where key = newkey) as value
from (select key as oldkey,
coalesce((select min(x1.key)
from x as x1
where x1.key > x.key), (select min(key)
from x)) as newkey
from x
order by key) as xx;
create unique index temp.idxRotate on rotate (oldkey);
update x
set value = (select value from temp.rotate where oldkey=x.key);
drop table temp.rotate;
commit;
---
The fact that there's a Highway to Hell but only a Stairway to Heaven says a
lot about anticipated traffic volume.
>-----Original Message-----
>From: Keith Medcalf [mailto:[email protected]]
>Sent: Monday, 22 January, 2018 18:00
>To: 'SQLite mailing list'
>Subject: RE: [sqlite] Can this be done with SQLite
>
>Completely generic solution. You change the direction of rotation by
>changing the SQL that builds your temp table ...
>
>sqlite> create table x (key integer primary key, value);
>sqlite> insert into x values (random(), random());
>sqlite> insert into x values (random(), random());
>sqlite> insert into x values (random(), random());
>sqlite> insert into x values (random(), random());
>sqlite> insert into x values (random(), random());
>sqlite> insert into x values (random(), random());
>sqlite> insert into x values (random(), random());
>sqlite> insert into x values (random(), random());
>sqlite> insert into x values (random(), random());
>sqlite> insert into x values (random(), random());
>sqlite> .head on
>sqlite> .mode column
>
>select * from x order by key;
>
>key value
>-------------------- --------------------
>-6374565986553047082 -6292999241545120883
>-5989898834901854520 -9081225235206840749
>-5612633422423030496 -3498480116044899177
>-3719342152283010731 -4268175217960688953
>-2423950719408034905 -3377215796687069970
>367353711932362007 3900645503222593618
>883226292009397075 -1973921941627299252
>1707896441609026036 -2722166238737751675
>6339993451314418730 -8055191930500241295
>8898575339909083958 7883859772702047363
>
>select oldkey,
> newkey,
> (select value from x where key = newkey) as value
> from (select key as oldkey,
> coalesce((select min(x1.key)
> from x as x1
> where x1.key > x.key), (select min(key)
>from x)) as newkey
> from x
> order by key) as xx;
>
>oldkey newkey value
>-------------------- -------------------- --------------------
>-6374565986553047082 -5989898834901854520 -9081225235206840749
>-5989898834901854520 -5612633422423030496 -3498480116044899177
>-5612633422423030496 -3719342152283010731 -4268175217960688953
>-3719342152283010731 -2423950719408034905 -3377215796687069970
>-2423950719408034905 367353711932362007 3900645503222593618
>367353711932362007 883226292009397075 -1973921941627299252
>883226292009397075 1707896441609026036 -2722166238737751675
>1707896441609026036 6339993451314418730 -8055191930500241295
>6339993451314418730 8898575339909083958 7883859772702047363
>8898575339909083958 -6374565986553047082 -6292999241545120883
>
>begin immediate;
>create temporary table rotate as
>select oldkey,
> newkey,
> (select value from x where key = newkey) as value
> from (select key as oldkey,
> coalesce((select min(x1.key)
> from x as x1
> where x1.key > x.key), (select min(key)
>from x)) as newkey
> from x
> order by key) as xx;
>update x
> set value = (select value from temp.rotate where oldkey=x.key);
>drop table temp.rotate;
>commit;
>
>select * from x order by key;
>
>key value
>-------------------- --------------------
>-6374565986553047082 -9081225235206840749
>-5989898834901854520 -3498480116044899177
>-5612633422423030496 -4268175217960688953
>-3719342152283010731 -3377215796687069970
>-2423950719408034905 3900645503222593618
>367353711932362007 -1973921941627299252
>883226292009397075 -2722166238737751675
>1707896441609026036 -8055191930500241295
>6339993451314418730 7883859772702047363
>8898575339909083958 -6292999241545120883
>
>---
>The fact that there's a Highway to Hell but only a Stairway to Heaven
>says a lot about anticipated traffic volume.
>
>
>>-----Original Message-----
>>From: sqlite-users [mailto:sqlite-users-
>>[email protected]] On Behalf Of Cecil Westerhof
>>Sent: Monday, 22 January, 2018 17:19
>>To: SQLite mailing list
>>Subject: Re: [sqlite] Can this be done with SQLite
>>
>>2018-01-23 1:02 GMT+01:00 Keith Medcalf <[email protected]>:
>>
>>>
>>> Part of the problem is going to be that you have not defined the
>>problem
>>> sufficiently for a "solution" to be proposed. Based on your
>>somewhat silly
>>> example one can deduce the following constraints:
>>>
>>> With respect to "key":
>>> - this is TEXT (UTF-8 or something else)?
>>> - you specify check(length(key)) == 1 do you mean:
>>> - one character in some encoding (key between 0 and
>>0xffffffffffffffff)
>>> - one byte? (ie, ord(key) between 0 and 255)
>>> - something else entirely?
>>> - is it contiguous?
>>> - if not contiguous what are the rules defining the non-
>>contiguousness?
>>>
>>
>>I would like a general solution. So the type of key is not defined
>>and it
>>is not necessary to be contiguous.
>>
>>
>>
>>
>>> - what is the "rotation order" based on?
>>> - next arithmetic value, upper wraps to lower?
>>> - next used key (by some collation order? Which collation
>>order?)
>>> - based on "used" values?
>>> - based on "entire domain"?
>>>
>>
>>Rotation is either up or down. In my example it was up. (In my
>>perception.)
>>
>>Order is just the default order.
>>
>>
>>
>>
>>> The problem and its solution is rather simple, once you define
>>problem to
>>> be solved with sufficient specificity to permit a solution.
>>>
>>> Your "example" below does not provide sufficient referents to
>>generate a
>>> solution that is cohesive over any problem domain other than that
>>covered
>>> by the example, and your referential constraints are inadequate to
>>ensure
>>> integrity for your limited example.
>>>
>>
>>I think I can solve it generally. I will look into it and share it
>>here.
>>
>>
>>
>>
>>> >-----Original Message-----
>>> >From: sqlite-users [mailto:sqlite-users-
>>> >[email protected]] On Behalf Of Cecil Westerhof
>>> >Sent: Monday, 22 January, 2018 13:30
>>> >To: SQLite mailing list
>>> >Subject: [sqlite] Can this be done with SQLite
>>> >
>>> >I have the following table:
>>> >CREATE TABLE playYouTubeVideo (
>>> > key TEXT NOT NULL,
>>> > speed FLOAT NOT NULL,
>>> >
>>> > CONSTRAINT key CHECK(length(key) == 1),
>>> > CONSTRAINT speed CHECK(TYPEOF(speed) = "real"),
>>> >
>>> > PRIMARY KEY(key)
>>> >);
>>> >
>>> >
>>> >Say I want to rotate a part:
>>> >- The value by key '1' becomes the value by key '2'.
>>> >- The value by key '2' becomes the value by key '3'.
>>> >- The value by key '3' becomes the value by key '4'.
>>> >- The value by key '4' becomes the value by key '5'.
>>> >- The value by key '5' becomes the value by key '6'.
>>> >
>>> >I suppose that I need to do this programmatically, or can this be
>>> >done
>>> >with SQL?
>>> >
>>> >And optionally also:
>>> >- The value by key '1' becomes the value by key '5'.
>>>
>>
>>--
>>Cecil Westerhof
>>_______________________________________________
>>sqlite-users mailing list
>>[email protected]
>>http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
_______________________________________________
sqlite-users mailing list
[email protected]
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users