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:kmedc...@dessus.com] >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- >>boun...@mailinglists.sqlite.org] 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 <kmedc...@dessus.com>: >> >>> >>> 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- >>> >boun...@mailinglists.sqlite.org] 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 >>sqlite-users@mailinglists.sqlite.org >>http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users _______________________________________________ sqlite-users mailing list sqlite-users@mailinglists.sqlite.org http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users