2017-02-14 6 views
0

Мне удалось создать таблицу из плоского txt-файла, но из-за макета этого метка времени не в нужном месте. Файл читается так:Обновление SQL Server с присоединением из той же таблицы

13-Feb-17 01:14 

N1 SUNDRY 331/6203 ASTOCK 000000 PICK 111111 0  3 0 0 268   

13-Feb-17 01:15 

N1 SUNDRY 397/5747 ASTOCK 000000 PICK 111111 0  2 0 0 268   

13-Feb-17 06:09 

MP GRENDZ 606/0484  000000   060472 0  0 0 0 193 
A5 GRENDZ 606/0484  000000   060472 1 26 5 0 3 
MP GRENDZ 346/9789  000000   060704 1  0 5 0 304 
A5 GRENDZ 346/9789  000000   060704 1  8 5 0 3 

Так что, когда я импортировать в новую таблицу с:

-- SELECT DATABASE 
    USE [CHDS_Sandbox] 
    GO 
    -- TRUNCATE TABLE 
    TRUNCATE TABLE [dbo].[LogScan] 
    GO 
-- INSERT NEW DATA 
INSERT INTO [dbo].[LogScan] 
      (move_type, program, cat, from_loc, pallet_no, to_loc, grds, pallets, items, tme, clk_num, id_num, movement_key, move_stamp, t_stamp) 
SELECT 
-- 0 AS id_als, 
CASE WHEN SUBSTRING(Field1,1,2) BETWEEN '0' AND '99' THEN '' ELSE SUBSTRING(Field1,1,2) END AS move_type, 
CASE WHEN SUBSTRING(Field1,4,6) LIKE '%-%' THEN '' ELSE SUBSTRING(Field1,4,6) END AS program, 
CASE WHEN SUBSTRING(Field1,11,8) LIKE '%:%' THEN '' ELSE SUBSTRING(Field1,11,8) END AS cat, 
SUBSTRING(Field1,20,6) AS from_loc, 
0+SUBSTRING(Field1,27,6) AS pallet_no, 
SUBSTRING(Field1,35,6) AS to_loc, 
0+SUBSTRING(Field1,42,6) AS grds, 
0+SUBSTRING(Field1,49,4) AS pallets, 
0+SUBSTRING(Field1,54,5) AS items, 
0+SUBSTRING(Field1,60,3) AS tme, 
0+SUBSTRING(Field1,64,3) AS clk_num, 
0+SUBSTRING(Field1,68,4) AS id_num, 
SUBSTRING(Field1,72,9) AS movement_key, 
CASE 
    WHEN SUBSTRING(Field1,4,3)='JAN' THEN CONVERT(DATETIME2(0),(SUBSTRING(Field1,1,15)),101) 
    WHEN SUBSTRING(Field1,4,3)='FEB' THEN CONVERT(DATETIME2(0),(SUBSTRING(Field1,1,15)),101) 
    WHEN SUBSTRING(Field1,4,3)='MAR' THEN CONVERT(DATETIME2(0),(SUBSTRING(Field1,1,15)),101) 
    WHEN SUBSTRING(Field1,4,3)='APR' THEN CONVERT(DATETIME2(0),(SUBSTRING(Field1,1,15)),101) 
    WHEN SUBSTRING(Field1,4,3)='MAY' THEN CONVERT(DATETIME2(0),(SUBSTRING(Field1,1,15)),101) 
    WHEN SUBSTRING(Field1,4,3)='JUN' THEN CONVERT(DATETIME2(0),(SUBSTRING(Field1,1,15)),101) 
    WHEN SUBSTRING(Field1,4,3)='JUL' THEN CONVERT(DATETIME2(0),(SUBSTRING(Field1,1,15)),101) 
    WHEN SUBSTRING(Field1,4,3)='AUG' THEN CONVERT(DATETIME2(0),(SUBSTRING(Field1,1,15)),101) 
    WHEN SUBSTRING(Field1,4,3)='SEP' THEN CONVERT(DATETIME2(0),(SUBSTRING(Field1,1,15)),101) 
    WHEN SUBSTRING(Field1,4,3)='OCT' THEN CONVERT(DATETIME2(0),(SUBSTRING(Field1,1,15)),101) 
    WHEN SUBSTRING(Field1,4,3)='NOV' THEN CONVERT(DATETIME2(0),(SUBSTRING(Field1,1,15)),101) 
    WHEN SUBSTRING(Field1,4,3)='DEC' THEN CONVERT(DATETIME2(0),(SUBSTRING(Field1,1,15)),101) 
END AS move_stamp, 
GETDATE() AS t_stamp 
FROM [CHDS_Staging].[dbo].[csv_ImportedData] 
WHERE SUBSTRING(Field1,11,8) LIKE '%/%' OR SUBSTRING(Field1,11,5) LIKE '%:%' AND SUBSTRING(Field1,27,6) NOT LIKE '%:%' 
GO 

, но это дает мне: enter image description here

мне нужно двигаться штамп в каждом из под ним, пока он не изменится.

Любая помощь по этому вопросу будет замечательной.

Это то, что работает в MySQL:

UPDATE dbo.LogScan t1 
    JOIN (
    SELECT id_als, @s:=IF(move_stamp IS NULL, @s, move_stamp) move_stamp 
    FROM (SELECT * 
    FROM dbo.LogScan 
    ORDER BY id_als) r, 
    (SELECT @s:='') t 
    ) t2 
    ON t1.id_als = t2.id_als 
    SET @t1.move_stamp = t2.move_stamp; 

ответ

0

я написал ниже запрос, и я надеюсь, что у меня нет какой-либо ошибки синтаксиса. , пожалуйста, проверьте, не работает ли это для вас. Я предположил, что ваш столбец is-als является столбцом int. также, если вы хотите, чтобы удалить пустые строки как строки 1,3,5,10 и т.д., то включает где состояние, которое в настоящее время комментировало в запросе вы можете использовать этот запрос для обновления строки

WITH StampCTE AS (
     SELECT ([id-als]+1) AS id-als,move_stamp 
     FROM [dbo].[LogScan] 
     WHERE move_stamp IS NOT NULL 
    ) 
    SELECT 
     T1.id_als, 
     T1.move_type, 
     T1.program, 
     T1.cat, 
     T1.from_loc, 
     T1.pallet_no, 
     T1.to_loc, 
     T1.grds, 
     T1.pallets, 
     T1.items, 
     T1.tme, 
     T1.clk_num, 
     T1.id_num, 
     T1.movement_key, 
     T1.move_stamp , 
     T2.move_stamp AS [NEW COLUMN MOVED] , 
     T1.t_stamp 
    FROM [dbo].[LogScan] T1 
    LEFT JOIN StampCTE T2 ON T1.id_als = T2.id-als 
    --WHERE RTRIM(LTRIM(T1.move_type)) <> '' 

обновления заявление:

I would first run the select and if you see that thats what you like then use the below: 



    WITH StampCTE AS (SELECT ([id_als]+1) AS id_als,move_stamp 
    FROM [dbo].[LogScan] WHERE move_stamp IS NOT NULL 
    ) 
    UPDATE T1 
    SET T1.move_stamp = T2.move_stamp 
    FROM [dbo].[LogScan] T1 
    LEFT JOIN StampCTE T2 ON T1.id_als = T2.id_als 

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

DECLARE @ID INT; 

WHILE (SELECT COUNT(*) FROM [dbo].[LogScan] WHERE move_stamp IS NULL) > 0 
BEGIN 

    SELECT TOP(1) @ID = id_als from [dbo].[LogScan] 
    WHERE move_stamp IS NULL 
    ORDER BY id_als; 

    WITH StampCTE AS ( 
    SELECT DISTINCT move_stamp 
    FROM [dbo].[LogScan] WHERE id_als = @ID-1 
    ) 
    UPDATE [dbo].[LogScan] T1 
    SET T1.move_stamp = StampCTE.move_stamp 

END 


SELECT * FROM [dbo].[LogScan] 
+0

Где бы это идти я заявление об обновлении? Или я просто добавляю его во вставку? –

+0

Только что обновил сообщение – BSAMEI

+0

Привет, BSAMEI, его закрыть, но его не заполнять все это в adn. Мне понадобится эта функция для работы с INSERT или если она запустит UPDATE сразу после этого, и она должна остаться в move_stamp. –