2014-06-21 26 views

cevap

0

Oracle 11, tam olarak ne istediğinizi yapan ignore nulls seçeneğini destekler. Tabii ki, sorunuz SQL Server ile ilgili, ancak bazen işlevselliğin bir yerde var olduğunu bilmek için yürekli.

Bu işlevselliği simüle etmek mümkündür. Buradaki fikir, önceki değere dayanarak bir gruba boş değerler atamaktır. Özünde, bu, null olmayan değerlerin sayısından önceki sayıdır. Bunu ilişkili bir alt sorguyla yapabilirsiniz. Ya da daha ilginç bir şekilde, iki sıra sayısının farkı ile. Daha sonra grup içinde max()'u kullanabilirsiniz.

Sanırım aşağıdakiler istediğiniz şeyi yapar. colNULL değerleri içerir ve ordering satırlar için sipariş olduğunu varsayalım:

select t.*, 
     max(col) over (partition by grp) as LagOnNull 
from (select t.*, 
      (row_number() over (order by ordering) - 
       row_number() over (partition by col order by ordering) 
      ) as grp 
     from table t 
    ) t; 

lead() benzer ancak sipariş tersine çevrilir. Ve bu ek bölümleme tuşları ile çalışacaktır, ancak bunları tüm pencere ifadelerine eklemeniz gerekir.

+0

Cevabınız için teşekkürler Gordon. Ama bu örnekte 'col2' neyin ne olduğunu anlayamıyorum? – Mostapha777

+0

'col2'' col' olmalı, 'lag() '/' lead() 'argümanı. –

+0

Yaratıcı çözüm Gordon. Ama ne yazık ki benim için işe yaramadı :( – Mostapha777

2

Muhtemel pencere işlevlerini kullanma. Daha fazla bilgi için Itzik Ben-Gan tarafından bu article bir okuma var.

Aşağıdaki kodda, cte en son NOT NULL kimliği değerini alıyor, sonraki seçim gerçek sütun değerini alıyor. Bu örnek LAG'yi kullanır. örn.

-- DDL for T1 
SET NOCOUNT ON; 
USE tempdb; 
IF OBJECT_ID(N'dbo.T1', N'U') IS NOT NULL DROP TABLE dbo.T1; 
GO 
CREATE TABLE dbo.T1 
(
id INT NOT NULL CONSTRAINT PK_T1 PRIMARY KEY, 
col1 INT NULL 
); 

-- Small set of sample data 
TRUNCATE TABLE dbo.T1; 

INSERT INTO dbo.T1(id, col1) VALUES 
(2, NULL), 
(3, 10), 
(5, -1), 
(7, NULL), 
(11, NULL), 
(13, -12), 
(17, NULL), 
(19, NULL), 
(23, 1759); 

;WITH C AS 
(
SELECT 
    id, 
    col1, 
    MAX(CASE WHEN col1 IS NOT NULL THEN id END) OVER(ORDER BY id ROWS UNBOUNDED PRECEDING) AS grp 
FROM dbo.T1 
) 
SELECT 
    id, 
    col1, 
    (SELECT col1 FROM dbo.T1 WHERE id = grp) lastval  
FROM C; 
İlgili konular