2016-03-24 4 views
0

Я хотел бы выбрать мозг любого эксперта sql, который может рассказать мне, как я могу выбрать различные значения из поля, а затем добавить уникальный идентификатор для каждого набора различных значений. Я могу написать короткий код для этого, но мне нужно это в запросе. Важно добавить, что мне нужно уникальное значение, начинающееся с 1 (в противном случае да, я знаю, что могу использовать существующий ID). Так это будет выглядеть следующим образом:mySQL выбрать отдельный и добавить уникальное значение

Patient_ID New_Unique_Value 
23   1 
23   1 
23   1 
4378   2 
4378   2 
48   3 
48   3 
48   3 
48   3 

Я могу написать Patient_IDs на временную таблицу, но я не могу найти любую информацию о динамическом добавлении уникального прироста.

ответ

1

Самый простой способ в MySQL является использование переменных:

select p.Patient_ID, 
     (@rn := if(@p = p.Patient_ID, @rn, 
        if(@p := p.Patient_ID, @rn + 1, @rn + 1) 
       ) 
     ) as New_Unique_Value 
from t cross join 
    (select @rn := 0, @p := -1) params 
order by patient_id; 
+0

Я никогда не видел этого: = operator before. Что это делает? –

+0

Это работало, однако я был немного отчаянным, поэтому я придумал много clunkier решение. Я буду помнить об этом в будущем - я никогда раньше не использовал переменные. –

+0

@eric_the_animal. , , ': =' устанавливает значение переменной в операторе 'select',' update' или 'delete' (в MySQL). –

0

вы можете использовать что-то вроде этого

set @a:=0; 
SELECT alpha2.ndx, beta.item 
FROM (
    SELECT alpha.item, (@a := @a + 1) as ndx from (
     SELECT DISTINCT item FROM tbl 
    ) alpha 
) AS alpha2 INNER JOIN tbl AS beta ON beta.item = alpha2.item 
0

Мое решение с использованием временной таблицы

CREATE TABLE IF NOT EXISTS OAK_origres.TEMP2 (PATID INTEGER, NEWID INTEGER AUTO_INCREMENT, PRIMARY KEY (NEWID)); 

INSERT INTO OAK_origres.TEMP2 (PATID) 
SELECT DISTINCT OAK_origres.`Original Results`.`Patient ID` FROM OAK_origres.`Original Results` 
INNER JOIN OAK_patient.Demographic ON OAK_origres.`Original Results`.`Patient ID` = OAK_patient.Demographic.`System ID` 
WHERE `Import Date` = '2014-09-23 13:00:00'; 

Что мне нужно было меньше значений, которые я мог бы использовать для дифференциации значений «Дата импорта». Я использовал значения автоинкремента для этого:

UPDATE OAK_origres.`Original Results` 
INNER JOIN OAK_origres.TEMP2 
    ON OAK_origres.`Original Results`.`Patient ID` = OAK_origres.TEMP2.PATID 
SET `Import Date`=DATE_ADD(`Import Date`, INTERVAL OAK_origres.TEMP2.NEWID SECOND) 
Смежные вопросы