sql >> Databasteknik >  >> RDS >> Sqlserver

Hitta det föregående värdet som inte är noll från en datumordnad lista

Här är ditt exempelbord

SELECT * INTO #TEMP
FROM
(
SELECT 'Item1' [Item Name],      '01/01/2013' [Date], 10.00 [Price]
UNION ALL
SELECT 'Item1',      '02/01/2013', 9.50
UNION ALL
SELECT 'Item1',      '03/01/2013', 0
UNION ALL
SELECT 'Item1',      '04/01/2013', 7.50
UNION ALL
SELECT 'Item1',     '05/01/2013', 0.00
UNION ALL
SELECT 'Item1',     '06/01/2013', 0.00
UNION ALL
SELECT 'Item1',     '07/01/2013', 11.00
UNION ALL
SELECT 'Item2',      '01/01/2013', 0.00
UNION ALL
SELECT 'Item2',     '02/01/2013', 12.00
UNION ALL
SELECT 'Item2',      '03/01/2013', 0.00
UNION ALL
SELECT 'Item2',      '04/01/2013', 0.00
UNION ALL
SELECT 'Item2',     '05/01/2013', 13.00
)TAB

Och resultatfrågan

 SELECT [Item Name],[Date],
CASE WHEN [Price]=0 THEN 
    ISNULL((SELECT TOP 1 [Price]
     FROM #TEMP T2 
     WHERE CAST(T2.[Date] AS DATE)<T1.[Date] AND T1.[Item Name]=T2.[Item Name] AND T2.[Price]>0
     ORDER BY CAST(T2.[Date] AS DATE) DESC),0) 
    ELSE [Price] END [Price]
FROM #TEMP T1

Ditt resultat är här

Här är den fungerande fiolen http://sqlfiddle.com/#!3/afabd/1 (Om det visar något fel när sidan laddas, tryck på RUNSQL, det kommer att fungera)




  1. Returnera alla möjliga kombinationer av värden på kolumner i SQL

  2. Hur man infogar data i mysql med Java

  3. Trigger Insert med en SELECT/JOIN

  4. Komplexa villkorsfråga:använder JPA istället för NativeQuery