here's some sample code ...I think it does what you are asking
reference http://sqlmag.com/t-sql/last-non-null-puzzle
CREATE TABLE #yourtable(
ID INT NOT NULL
,Shipto INT
,Description VARCHAR(25)
,ItemN INTEGER NOT NULL
);
INSERT INTO #yourtable(ID,Shipto,Description,ItemN) VALUES
(1,17000215,'TIMES SUPER #2 KAHALA',41172),(2,NULL,NULL,41220),(3,NULL,NULL,36720),(4,NULL,NULL,40329),(5,NULL,NULL,40326),(6,NULL,NULL,41171)
,(7,NULL,NULL,41173),(8,NULL,NULL,40692),(9,NULL,NULL,36723),(10,NULL,NULL,40718),(11,NULL,NULL,41169),(12,NULL,NULL,40320),(13,NULL,NULL,41168)
,(15,17000815,'TIMES SUPER #8-BERETANIA',41220),(16,NULL,NULL,36720),(17,NULL,NULL,40326),(18,NULL,NULL,41173),(19,NULL,NULL,41212)
,(20,NULL,NULL,40320),(21,NULL,NULL,41168)
,(23,17001015,'TIMES SUPER#10-KOOLAU',41172),(24,NULL,NULL,36716),(25,NULL,NULL,36720),(26,NULL,NULL,40329),(27,NULL,NULL,41173);
--one solution ref http://sqlmag.com/t-sql/last-non-null-puzzle
SELECT ID,
Shipto,
Description,
ItemN,
CAST(SUBSTRING(MAX(CAST(id AS BINARY(4)) + CAST(shipto AS BINARY(4))) OVER(ORDER BY id ROWS UNBOUNDED PRECEDING), 5, 4) AS INT) AS shipto_new,
CAST(SUBSTRING(MAX(CAST(id AS BINARY(4))+CAST(NULLIF(Description, '') AS VARBINARY(25))) OVER(ORDER BY id ROWS UNBOUNDED PRECEDING), 5, 25) AS VARCHAR(25)) AS description_new
FROM #yourtable
ORDER BY ID;
DROP TABLE #yourtable
________________________________________________________________
you can lead a user to data....but you cannot make them think
and remember....every day is a school day