Как выбрать строку для вставки с тем же идентификатором в SQL?

так что в основном у меня есть таблица с именем & quot; table_1 & quot; :

ID   Index          STATUS          TIME        DESCRIPTION
1     15          pending           1:00       Started Pending
1     16          pending           1:05       still in request
1     17          pending           1:10       still in request
1     18          complete          1:20       Transaction has been completed
2     19          pending           2:25       request has been started
2     20          pending           2:30       in progress
2     21          pending           2:35       in progess still
2     22          pending           2:40       still pending
2     23          complete          2:45       Transaction Compeleted

Мне нужно вставить эти данные в мою вторую таблицу & quot; table_2 & quot; где включены только времена старта и соревнования, поэтому моя & quot; таблица_2 & quot; должно вот так:

ID   Index   STATUS          TIME          DESCRIPTION
1     15     pending         1:00          Started Pending
1     18     complete        1:20          Transaction has been completed
2     19     pending         2:25          request has been started
2     23     complete        2:45          Transaction Compeleted

если кто-то может помочь мне написать SQL-запрос для этого, я был бы очень признателен. заранее спасибо

 Jeff Watkins01 июн. 2012 г., 01:42
Я здесь занимаюсь фристайлом, но думаю, что идентификация - это какая-то работа. Таким образом, у вас есть таблица JOB с PK, затем у вас будет какая-то таблица JOB_STATUS_HISTORY с FK-JOB и либо естественно уникальным ключом, либо суррогатным идентификатором, который будет уникальным. Я, вероятно, также каким-то образом абстрагирую ваше состояние, поскольку повторяющиеся строки могут быть хрупкими для будущего использования. Возможно, стоит подумать о том, чтобы на самом деле иметь «старт» состояние, то есть начало, ожидание, завершение и т. д. Хотя в этом случае ожидание, кажется, означает только то, что задание еще живо, поэтому в целом более подходящим был бы другой дизайн.
 Bilal Akil01 июн. 2012 г., 01:42
Конкретным идентификатором в этом случае является вся строка. Первичный ключ - это все три поля
 Jeff Watkins01 июн. 2012 г., 01:34
Если у вас несколько одинаковых идентификаторов, они не являются идентификаторами. Возможно, вам следует пересмотреть свой дизайн.
 user142959501 июн. 2012 г., 01:38
вы бы посчитали идентификатор как конкретный идентификатор

Ответы на вопрос(4)

INSERT INTO myTable2 (ID, STATUS, TIME, DESCRIPTION)
SELECT t1.ID, t1.STATUS, t1.TIME, t1.DESCRIPTION FROM table_1 as t1 
WHERE STATUS = 'complete' 
OR TIME = (SELECT min(TIME) FROM table_1 WHERE ID = t1.ID) 
ORDER BY ID asc, STATUS desc
Решение Вопроса
INSERT INTO t2 (ID, STATUS, TIME)
SELECT ID, STATUS, MIN(TIME) FROM t1 t1top
WHERE EXISTS(SELECT * FROM t1 WHERE ID=t1top.ID AND STATUS='Complete')
GROUP BY ID, STATUS
ORDER BY CAST(ID AS UNSIGNED) ASC, STATUS DESC

как вставка сделана, если вы хотите увидеть результат в соответствии с вашим примером, вы должны выполнить следующее select:

SELECT ID, STATUS, TIME FROM table_1
ORDER BY CAST(ID AS UNSIGNED) ASC, STATUS DESC

это ТОЛЬКО ПРАВИЛЬНО, однако я не хочу просто ВИДЕТЬ его таким образом, он также должен быть вставлен во вторую таблицу таким образом, любая идея?

 01 июн. 2012 г., 01:53
это псевдоним для вашей основной таблицы t1, поэтому механизм не смешивается между «t1top»; который является верхним, и t1 из предложения EXISTS Но просто назовите его, как вам больше нравится
 user142959501 июн. 2012 г., 01:51
что такое t1top? извините я новичок
 user142959501 июн. 2012 г., 02:08
Я получаю синтаксическую ошибку, сообщение 156, уровень 15, состояние 1, строка 45 Неправильный синтаксис рядом с ключевым словом «ГДЕ». Я действительно ценю вашу помощь
 02 июн. 2012 г., 00:29
да, вышеупомянутый запрос вставлял дважды полные строки статуса. Удаление соединительной части устраняет проблему.
 02 июн. 2012 г., 00:22
Во второй половине этого оператора будут выбраны все записи из t1, где status = «Complete». Мне кажется, что он должен иметь другое предложение, гарантирующее объединение только совпадающего объекта Complete с тем же идентификатором.
INSERT INTO table_2
SELECT id,status,min(time)
FROM table_1 AS t1
WHERE EXISTS(SELECT 1
             FROM table_1
             WHERE id=t1.id
                 AND status='complete')
GROUP BY id,status

 01 июн. 2012 г., 01:59
Подожди меня глупо, ты не можешь сортировать вставку. Вам необходимо применить идентификатор ORDER BY, статус, когда вы выбираете из этой таблицы - например, SELECT * FROM table_2, идентификатор ORDER BY, статус
 01 июн. 2012 г., 01:55
О сортировке - мой плохой, совсем забыл. Это там сейчас (эта новая нижняя строка). Если ожидающие и завершенные задания задом наперед, добавьте ключевое слово DESC после статуса в порядке. Мой мозг глуп, и я не могу понять, есть ли он или не должен быть там ...
 user142959501 июн. 2012 г., 01:43
к сожалению не сработало :(
 01 июн. 2012 г., 01:44
Да, я просто добавляю проверку, чтобы убедиться, что Complete существует, - есть еще информация о том, как он не работает?
 user142959501 июн. 2012 г., 01:52
всем привет? он частично работал, но не сортировал их правильно, результат был 1 полный 2012-05-31 01: 20: 00.000 2 полный 2012-05-31 02: 45: 00.000 1 ожидающий 2012-05-31 01: 00: 00.000 2 в ожидании 2012-05-31 02: 25: 00.000

все времена запуска, как это:

   select id, status, min(time) 
   from table_1 
   where status = 'Pending'
   group by id, status

затем завершение как это:

   select id, status, time
   from table_1 
   where status = 'Complete'
   group by id, status

Вы можете использовать union, чтобы использовать оба, и, конечно, попробуйте:

   insert into table_2

Ваш ответ на вопрос