sql >> Database >  >> RDS >> Sqlserver

De vorige waarde niet-nul vinden in een op datum geordende lijst

Hier is je voorbeeldtabel

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

En de resultaatquery

 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

Je resultaat is hier

Hier is de werkende Fiddle http://sqlfiddle.com/#!3/afabd/1 (Als het een fout toont bij het laden van de pagina, druk dan op RUNSQL, het zal werken)




  1. JDBC PreparedStatement resulteert in MySQL-syntaxisfout

  2. Spring Boot JPA MySQL:kan geen geschikte stuurprogrammaklasse bepalen

  3. Een manier om gegevens uit een DateTime-waarde te extraheren zonder seconden

  4. MySQL Een lijst met waarden opvragen