SQLite: добавление столбца, который содержит позицию строки - PullRequest
3 голосов
/ 18 июня 2011

У меня есть таблица SQLite, и мне нужно добавить столбец, содержащий позицию строки, заданную инструкцией SELECT.
Инструкция SELECT содержит два предложения порядка.

На случай, если неясно, вот пример:
Учитывая эти данные:

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

Как я могу это сделать?

ВАЖНОЕ ПРИМЕЧАНИЕ: Это не фактические данные или даже фактические столбцы. это просто пример.

1 Ответ

1 голос
/ 18 июня 2011

В этом запросе должны быть указаны все поля, которые вы заполняете:

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

Теперь, чтобы заказать их по ID:

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

Примечания

  • Если внутренний Order By не работает, вы можете вывести промежуточные результаты в временную таблицу, а затем выбрать из временной таблицы окончательное предложение Order By.
  • "1000" выше - это коэффициент. Вам необходимо убедиться, что этот коэффициент больше максимального значения c2, но не настолько высок, чтобы получить целочисленное переполнение.

Альтернативный метод

Вы можете вставить во временную таблицу со столбцом AutoIncrement, а затем выбрать значения из этой временной таблицы в зависимости от желаемого порядка.

http://www.sqlite.org/autoinc.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...