SQL-запрос консолидации - PullRequest
       2

SQL-запрос консолидации

0 голосов
/ 14 сентября 2011

У меня есть простая таблица данных (ник, счет) для простой игры для Android.Изначально я не ставил уникальный идентификатор для каждого псевдонима, и теперь у меня есть несколько записей с одного и того же псевдонима.

Теперь я хочу объединить данные, удалив «лишнюю» запись из одного и того же псевдонима.псевдоним и поддерживать их соответствующий высокий балл.

Я пытался сделать запрос, чтобы сделать это, но безуспешно.

Что вы предлагаете для достижения нужного мне результата?

Ответы [ 3 ]

1 голос
/ 14 сентября 2011

Я думаю, что вы хотите сделать это:

create table temptable (nickname varchar(50), score int);

insert into temptable (nickname, score)
select nickname, max(score)
from yourtable
group by nickname;

delete from yourtable;

insert into yourtable (nickname, score)
select nickname, max(score)
from temptable;

Однако , если бы я был вами, я бы не удалял оценки.Вы можете отслеживать каждый результат, а затем просто запрашивать, что вы хотите.

Хотите получить 10 лучших результатов?Здесь:

select nickname, score
from yourtable
order by score desc
limit 10

Хотите высокие оценки каждого пользователя?Здесь:

select nickname, max(score)
from yourtable
group by nickname;

Общее предложение: отслеживать все, запросить соответственно .

1 голос
/ 14 сентября 2011

Как насчет создания новой таблицы и добавления записей с помощью этого запроса.

INSERT INTO newscorestable(nickname, score) 
SELECT nickname, max(score) 
FROM oldscorestable GROUP BY nickname

И удаления старой таблицы

Этот набор запросов должен это сделать (предполагая, что исходное имя таблицы будетбаллы).

CREATE TABLE scores2 AS 
       SELECT nickname, max(score) as score FROM scores GROUP BY nickname;

DELETE FROM scores;

INSERT INTO scores SELECT nickname, score FROM scores2;

DROP TABLE scores2;

/* to free unused space */
VACUUM;
0 голосов
/ 14 сентября 2011

Попробуйте следующее (у меня нет сейчас установки SQLite для проверки точного синтаксиса для коррелированного подзапроса):

 DELETE FROM Scores WHERE EXISTS 
    (SELECT * FROM Scores S2 
     WHERE S2.nickname = nickname AND S2.score > score)

или (это правильно, благодаря тестированию danishgoel вкомментарии, приведенные ниже)

 DELETE FROM Scores WHERE EXISTS 
    (SELECT * FROM Scores S2 
     WHERE S2.nickname = Scores.nickname AND S2.score > Scores.score)

Должно быть идеально выполнено для одноразового использования более нескольких тысяч псевдонимов.

Это оставит вас с дубликатами, если у вас есть два одинаковых балла дляучитывая прозвище, это возможно?

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