Bildiğiniz gibi, LAG() & LEAD() analitik işlevleri, aynı sonuca sahip bir önceki ve bir sonraki satırdaki verilere, kendi kendine birleştirme kullanmadan erişir. Ancak NULL değerlerini NOT NULL değerine erişene kadar görmezden gelmek mümkün mü?SQL Server'da LAG() ve LEAD() işlevlerini kullanırken NULL değerlerini yok saymak mümkün mü?
cevap
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. col
NULL
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.
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;
- 1. SQL sorgusu null değerlerini içeren iki sütunun değerlerini eklemek için?
- 2. SQL sorgusu: Sola topla işlevini kullanırken NULL olmamalıdır NULL değerleri
- 3. ViewState değerlerini deşifre etmek ve görüntülemek mümkün mü?
- 4. Tüm dize değişken isimlerini ve değerlerini listelemek mümkün mü
- 5. Belirli bir önek ile varlık kataloğundaki resimleri saymak mümkün mü?
- 6. Bir nesneyi null olarak ayarlamak mümkün mü?
- 7. Mysql AVG yok saymak için
- 8. genel lag
- 9. Grafik nesnelerinin işlevlerini miras yoluyla genişletmek mümkün mü?
- 10. NULL değerlerini kullanarak bu örnekte
- 11. XQuery ayrı-değerlerini kullanırken()
- 12. TFS'de "geçmişi yok et" yapmak mümkün mü?
- 13. Doğrudan jquery ve Svg ile çalışmak mümkün mü (eklenti yok)?
- 14. SQL Server NULL kısıtlaması
- 15. SQL NOSQL karışımı mümkün mü değil mi?
- 16. mümkün mü?
- 17. BOM'ları 'yok saymak için ant concat alın'?
- 18. sql server ile sql serverda bir tablo nasıl yaratılır ad nerede kullanıcı tarafından girilir
- 19. Python yorumlayıcısının durumunu bir dosyaya kaydetmek mümkün mü? Bir kullanıcı Python uygulaması ve uygulama çöker kullanırken
- 20. jQuery .each() kullanırken, anonim olmayan bir işlev kullanmak mümkün mü?
- 21. ASP.NET oturumları kullanırken eşzamanlılık isteğini zorlamak mümkün mü?
- 22. Com nesnesi, mümkün mü?
- 23. Web sitemden normal javascript ve css işlevlerini angularjs uygulamasına eklemek mümkün mü?
- 24. NHibernate QueryOver'da SQL işlevlerini kullanabilir miyim?
- 25. Navigator.push() kullanırken geçişi devre dışı bırakmak mümkün mü?
- 26. Belirlenen başlatıcıyı kullanırken 'bu' yapıya işaretçi almak mümkün mü?
- 27. ? mümkün mü?
- 28. SQL Görünümleri - değişken yok mu?
- 29. mümkün mü?
- 30. mümkün mü?
Cevabınız için teşekkürler Gordon. Ama bu örnekte 'col2' neyin ne olduğunu anlayamıyorum? – Mostapha777
'col2'' col' olmalı, 'lag() '/' lead() 'argümanı. –
Yaratıcı çözüm Gordon. Ama ne yazık ki benim için işe yaramadı :( – Mostapha777