คำถามติดแท็ก window-functions

ฟังก์ชันที่แบ่งพาร์ติชันชุดผลลัพธ์และคำนวณบางสิ่งภายในพาร์ติชันนั้นโดยไม่ต้องรวบรวมข้อมูลในพาร์ติชันนั้น

5
การนับ SQL แตกต่างกันในพาร์ติชัน
ฉันมีตารางที่มีสองคอลัมน์ฉันต้องการนับค่าที่แตกต่างใน Col_B มากกว่า (เงื่อนไขโดย) Col_A MyTable Col_A | Col_B A | 1 A | 1 A | 2 A | 2 A | 2 A | 3 b | 4 b | 4 b | 5 ผลลัพธ์ที่คาดหวัง Col_A | Col_B | Result A | 1 | 3 A | 1 …

2
หน้าต่างชดเชยตรงตามเวลาประทับ
ฉันกำลังเขียนคิวรีที่จะใช้ในหน้าผลลัพธ์สำหรับโซเชียลฟีด แนวคิดคือแอพมือถือจะขอรายการ N และให้เริ่มต้นวันที่และเวลาที่ฉันได้เรียก@CutoffTimeด้านล่าง วัตถุประสงค์ของเวลา cutoff คือการสร้างเมื่อหน้าต่างการเพจควรเริ่มทำงาน เหตุผลที่เราใช้การประทับเวลาแทนการชดเชยแถวคือการประทับเวลาจะทำให้เราหน้าจากตำแหน่งที่สอดคล้องกันเมื่อรับโพสต์ที่เก่ากว่าแม้ว่าจะมีการเพิ่มเนื้อหาโซเชียลใหม่ เนื่องจากรายการฟีดโซเชียลอาจมาจากตัวคุณเองหรือเพื่อนของคุณที่ฉันใช้UNIONเพื่อรวมผลลัพธ์จากทั้งสองกลุ่ม เดิมทีฉันลองใช้วิธีที่TheQuery_CTEไม่มีตรรกะUNIONและมันก็เป็นสุนัขช้า นี่คือสิ่งที่ฉันได้ทำ (รวมถึงตารางคีที่เกี่ยวข้อง): CREATE TABLE [Content].[Photo] ( [PhotoId] INT NOT NULL PRIMARY KEY IDENTITY (1, 1), [Key] UNIQUEIDENTIFIER NOT NULL DEFAULT NEWID(), [FullResolutionUrl] NVARCHAR(255) NOT NULL, [Description] NVARCHAR(255) NULL, [Created] DATETIME2(2) NOT NULL DEFAULT SYSUTCDATETIME(), ); CREATE TABLE [Content].[UserPhotoAssociation] ( [PhotoId] …

1
เหตุใดแบบสอบถาม SQL Server ของฉันจึงทำงานต่างจาก UPDATE มากกว่า SELECT
ฉันเขียนแบบสอบถาม SQL Server ที่อัปเดตระเบียนให้มีหมายเลขตามลำดับหลังจากแบ่งพาร์ติชันในเขตข้อมูล เมื่อฉันเรียกใช้เป็นคำสั่ง SELECT ทุกอย่างดูดี: DECLARE @RunDetailID INT = 448 DECLARE @JobDetailID INT SELECT @JobDetailID = [JobDetailID] FROM [RunDetails] WHERE [RunDetailID] = @RunDetailID SELECT [OrderedRecords].[NewSeq9], RIGHT([OrderedRecords].[NewSeq9], 4) FROM ( SELECT [Records].*, [Records].[SortField] + RIGHT('0000' + CAST(ROW_NUMBER() OVER(PARTITION BY [Records].[SortField] ORDER BY [Records].[RunDetailID], [Records].[SortField], [Records].[PieceID]) AS VARCHAR), 4) NewSeq9 …

2
ฟังก์ชั่นหน้าต่างทำให้เกิดแผนการดำเนินการที่น่ากลัวเมื่อถูกเรียกจากมุมมองที่มี parametrized ภายนอกโดยที่ 'clause
ฉันมีปัญหานี้มานานแล้วฉันพบวิธีแก้ปัญหาที่เหมาะกับฉันและลืมมันไป แต่ตอนนี้มีคำถามนั้นดังนั้นฉันยินดีที่จะทำให้ปัญหานี้เกิดขึ้น มีมุมมองที่รวมตารางบางอย่างในทางตรงไปตรงมามาก (คำสั่ง + คำสั่งซื้อ) เมื่อถูกสอบถามโดยไม่มีwhereประโยคมุมมองจะส่งกลับหลายล้านบรรทัด อย่างไรก็ตามไม่มีใครเคยเรียกมันว่าอย่างนั้น แบบสอบถามปกติคือ select * from that_nasty_view where order_number = 123456; สิ่งนี้จะส่งกลับประมาณ 10 ระเบียนจาก 5m สิ่งสำคัญ: มุมมองมีฟังก์ชั่นหน้าต่างrank()ซึ่งแบ่งพาร์ติชันตามฟิลด์โดยใช้มุมมองที่ถูกสอบถามเสมอ: rank() over (partition by order_number order by detail_line_number) ตอนนี้ถ้ามุมมองนี้ถูกสอบถามด้วยพารามิเตอร์ที่แท้จริงในสตริงแบบสอบถามตรงตามที่แสดงข้างต้นก็จะส่งกลับแถวทันที แผนการดำเนินการเป็นเรื่องปกติ: ดัชนีค้นหาทั้งสองตารางโดยใช้ดัชนีบนorder_number(ส่งคืน 10 แถว) การคำนวณหน้าต่างเหนือผลลัพธ์เล็ก ๆ ที่ส่งคืน การเลือก อย่างไรก็ตามเมื่อมีการเรียกใช้มุมมองในแบบที่กำหนดสิ่งต่าง ๆ น่ารังเกียจ: Index scanบนตารางทั้งหมดที่ละเว้นดัชนี ส่งคืนแถว 5 ม. เข้าร่วมมาก การคำนวณหน้าต่างทั้งหมดpartitions …

3
วิธีการเลือกชุดของค่าที่ไม่ใช่ NULL ล่าสุดต่อคอลัมน์ในกลุ่ม?
ฉันใช้ SQL Server 2016 และข้อมูลที่ฉันใช้อยู่มีแบบฟอร์มต่อไปนี้ CREATE TABLE #tab (cat CHAR(1), t CHAR(2), val1 INT, val2 CHAR(1)); INSERT INTO #tab VALUES ('A','Q1',2,NULL),('A','Q2',NULL,'P'),('A','Q3',1,NULL),('A','Q3',NULL,NULL), ('B','Q1',5,NULL),('B','Q2',NULL,'P'),('B','Q3',NULL,'C'),('B','Q3',10,NULL); SELECT * FROM #tab; ฉันต้องการขอรับค่าที่ไม่ใช่ null สุดท้ายมากกว่าคอลัมน์val1และval2จัดกลุ่มตามและได้รับคำสั่งจากcat tผลลัพธ์ที่ฉันต้องการคือ cat val1 val2 A 1 P B 10 C สิ่งที่ฉันเข้ามาใกล้ที่สุดคือการใช้LAST_VALUEขณะที่เพิกเฉยสิ่งORDER BYที่ไม่สามารถใช้งานได้เนื่องจากฉันต้องการค่าที่ไม่ใช่ค่าว่างที่สั่งล่าสุด SELECT DISTINCT cat, LAST_VALUE(val1) OVER(PARTITION BY cat ORDER BY …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.