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

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

6
ผลรวมสะสมช่วงวันที่โดยใช้ฟังก์ชั่นหน้าต่าง
ฉันต้องคำนวณผลรวมสะสมในช่วงวันที่ เพื่อแสดงให้เห็นถึงการใช้ฐานข้อมูลตัวอย่าง AdventureWorksไวยากรณ์สมมุติฐานต่อไปนี้จะทำสิ่งที่ฉันต้องการ: SELECT TH.ProductID, TH.TransactionDate, TH.ActualCost, RollingSum45 = SUM(TH.ActualCost) OVER ( PARTITION BY TH.ProductID ORDER BY TH.TransactionDate RANGE BETWEEN INTERVAL 45 DAY PRECEDING AND CURRENT ROW) FROM Production.TransactionHistory AS TH ORDER BY TH.ProductID, TH.TransactionDate, TH.ReferenceOrderID; น่าเศร้าที่RANGEขนาดของกรอบหน้าต่างไม่อนุญาตให้มีช่วงเวลาใน SQL Server ฉันรู้ว่าฉันสามารถเขียนวิธีการใช้แบบสอบถามย่อยและการรวมปกติ (ไม่ใช่หน้าต่าง): SELECT TH.ProductID, TH.TransactionDate, TH.ActualCost, RollingSum45 = ( SELECT SUM(TH2.ActualCost) …

2
ฟังก์ชั่น MySQL และหน้าต่าง
ดูเหมือนว่าMySQLไม่รองรับฟังก์ชั่นหน้าต่าง เช่นง่าย ๆ : COUNT(*) OVER() AS cntไม่ทำงาน สิ่งที่ฉันไม่แน่ใจคือถ้าสิ่งนี้นำไปใช้กับรุ่นเชิงพาณิชย์เช่นกัน (ฉันถือว่ารุ่นชุมชนเป็นชุดย่อยที่ จำกัด ) ถ้าไม่วิธีการหนึ่งที่จะแก้ไขคุณสมบัติที่ขาดหายไปนี้ได้อย่างไร

4
จำกัด ผลลัพธ์ให้อยู่ในแถวที่ 2 อันดับแรก
ใน SQL Server 2008 ฉันใช้เพื่อกลับชุดข้อมูลที่มีRANK() OVER (PARTITION BY Col2 ORDER BY Col3 DESC) RANKแต่ฉันมีหลายร้อยเร็กคอร์ดสำหรับแต่ละพาร์ติชันดังนั้นฉันจะได้รับค่าจากอันดับ 1, 2, 3 ...... 999 แต่ฉันต้องการได้มากถึง 2 RANKsในแต่ละPARTITIONครั้ง ตัวอย่าง: ID Name Score Subject 1 Joe 100 Math 2 Jim 99 Math 3 Tim 98 Math 4 Joe 99 History 5 Jim 100 History 6 Tim 89 …

4
ใช้ DISTINCT ในฟังก์ชั่นหน้าต่างกับ OVER
ฉันพยายามที่จะโยกย้ายแบบสอบถามจาก Oracle ไปยัง SQL Server 2014 นี่คือข้อความค้นหาของฉันที่ใช้งานได้ดีใน Oracle: select count(distinct A) over (partition by B) / count(*) over() as A_B from MyTable นี่คือข้อผิดพลาดที่ฉันได้รับหลังจากพยายามเรียกใช้แบบสอบถามนี้ใน SQL Server 2014 Use of DISTINCT is not allowed with the OVER clause ใครรู้ว่าปัญหาคืออะไร? เป็นชนิดของแบบสอบถามที่เป็นไปได้ใน SQL Server หรือไม่ กรุณาแนะนำ

6
ค้นหาหมายเลขฟรี“ n” ติดต่อกันจากตาราง
ฉันมีตารางที่มีตัวเลขเช่นนี้ (สถานะเป็นได้ทั้งฟรีหรือถูกมอบหมาย) สถานะหมายเลข id_set ----------------------- 1 000001 ที่มอบหมาย 1 000002 ฟรี 1 000003 มอบหมาย 1 000004 ฟรี 1 000005 ฟรี 1 000006 มอบหมาย 1 000007 มอบหมาย 1 000008 ฟรี 1 000009 ฟรี 1 000010 ฟรี 1 000011 ได้รับมอบหมาย 1 000012 ได้รับมอบหมาย 1 000013 ได้รับมอบหมาย 1 000014 ฟรี 1 000015 ได้รับมอบหมาย …

1
วิ่งรวมไปยังแถวก่อนหน้า
ฉันต้องการความช่วยเหลือเกี่ยวกับฟังก์ชั่นหน้าต่าง ฉันรู้ว่าคุณสามารถคำนวณผลรวมภายในหน้าต่างและผลรวมสะสมภายในหน้าต่าง แต่เป็นไปได้หรือไม่ที่จะคำนวณผลรวมการทำงานก่อนหน้าเช่นผลรวมการรันที่ไม่รวมแถวปัจจุบัน ฉันคิดว่าคุณจะต้องใช้ROWหรือRANGEโต้แย้ง ฉันรู้ว่ามีCURRENT ROWตัวเลือก แต่ฉันต้องการCURRENT ROW - 1ซึ่งเป็นไวยากรณ์ที่ไม่ถูกต้อง ความรู้ROWและRANGEข้อโต้แย้งของฉันมี จำกัด ดังนั้นความช่วยเหลือใด ๆ จะได้รับสุดซึ้ง ฉันรู้ว่ามีหลายโซลูชั่นในการแก้ไขปัญหานี้ แต่ฉันกำลังมองหาที่จะเข้าใจROW, RANGEข้อโต้แย้งและผมถือว่าปัญหาสามารถแตกกับสิ่งเหล่านี้ ฉันได้รวมวิธีที่เป็นไปได้หนึ่งวิธีไว้เพื่อคำนวณผลรวมการวิ่งก่อนหน้า แต่ฉันสงสัยว่ามีวิธีที่ดีกว่านี้หรือไม่: USE AdventureWorks2012 SELECT s.SalesOrderID , s.SalesOrderDetailID , s.OrderQty , SUM(s.OrderQty) OVER (PARTITION BY SalesOrderID) AS RunningTotal , SUM(s.OrderQty) OVER (PARTITION BY SalesOrderID ORDER BY SalesOrderDetailID) - s.OrderQty AS PreviousRunningTotal -- …

7
การจัดกลุ่มหรือหน้าต่าง
ฉันมีสถานการณ์ที่ฉันคิดว่าสามารถแก้ไขได้โดยใช้ฟังก์ชั่นหน้าต่าง แต่ฉันไม่แน่ใจ ลองนึกภาพตารางต่อไปนี้ CREATE TABLE tmp ( date timestamp, id_type integer ) ; INSERT INTO tmp ( date, id_type ) VALUES ( '2017-01-10 07:19:21.0', 3 ), ( '2017-01-10 07:19:22.0', 3 ), ( '2017-01-10 07:19:23.1', 3 ), ( '2017-01-10 07:19:24.1', 3 ), ( '2017-01-10 07:19:25.0', 3 ), ( '2017-01-10 07:19:26.0', 5 …

3
วิธีรับค่า non-null ล่าสุดในคอลัมน์ที่เรียงลำดับของตารางขนาดใหญ่ได้อย่างไร
ฉันมีอินพุตต่อไปนี้: id | value ----+------- 1 | 136 2 | NULL 3 | 650 4 | NULL 5 | NULL 6 | NULL 7 | 954 8 | NULL 9 | 104 10 | NULL ฉันคาดหวังผลลัพธ์ต่อไปนี้: id | value ----+------- 1 | 136 2 | 136 3 | 650 4 …

1
รวมสองตารางเหตุการณ์ไว้ในไทม์ไลน์เดียว
รับสองตาราง: CREATE TABLE foo (ts timestamp, foo text); CREATE TABLE bar (ts timestamp, bar text); ฉันต้องการที่จะเขียนแบบสอบถามว่าค่าตอบแทนts, fooและbarที่แสดงถึงมุมมองแบบครบวงจรของค่าล่าสุด กล่าวอีกนัยหนึ่งถ้าfooมี: ts | foo -------- 1 | A 7 | B และbarบรรจุ: ts | bar -------- 3 | C 5 | D 9 | E ฉันต้องการคิวรีที่ส่งคืน: ts | foo | bar -------------- 1 …

2
เลือกลำดับต่อเนื่องที่ยาวที่สุด
ฉันพยายามสร้างแบบสอบถามใน PostgreSQL 9.0 ที่ได้รับลำดับของแถวต่อเนื่องที่ยาวที่สุดสำหรับคอลัมน์ที่ระบุ พิจารณาตารางต่อไปนี้: lap_id (serial), lap_no (int), car_type (enum), race_id (int FK) ในกรณีที่มีความเป็นเอกลักษณ์ของแต่ละlap_no(race_id, car_type) ฉันต้องการให้คิวรีสร้างลำดับที่ยาวที่สุดสำหรับหนึ่งrace_idและcar_typeดังนั้นจึงส่งคืนint(หรือยาว) ที่สูงที่สุด ด้วยข้อมูลต่อไปนี้: 1, 1, red, 1 2, 2, red, 1 3, 3, red, 1 4, 4, red, 1 5, 1, blue, 1 6, 5, red, 1 7, 2, blue, 1 8, 1, green, …

2
การใช้ฟังก์ชั่นหน้าต่างเพื่อส่งต่อค่าที่ไม่ใช่ค่าว่างในพาร์ติชัน
พิจารณาตารางที่บันทึกการเข้าชม create table visits ( person varchar(10), ts timestamp, somevalue varchar(10) ) พิจารณาข้อมูลตัวอย่างนี้ (การประทับเวลาประยุกต์เป็นตัวนับ) ts| person | somevalue ------------------------- 1 | bob |null 2 | bob |null 3 | jim |null 4 | bob | A 5 | bob | null 6 | bob | B 7 | jim | …

1
เหตุใดหน้าต่างโหมดแบตช์จึงรวมการคำนวณทางคณิตศาสตร์มากเกินไป
แบบสอบถามต่อไปนี้ดำเนินการแบบหน้าต่างSUMเหนือตาราง columnstore ด้วย1500 total rowsซึ่งแต่ละอันมีค่า 0 หรือ 1 และมัน overflows INTชนิดข้อมูล ทำไมสิ่งนี้จึงเกิดขึ้น SELECT a, p, s, v, m, n, SUM(CASE WHEN n IS NULL THEN 0 ELSE 1 END) OVER (PARTITION BY s, v, a ORDER BY p) AS lastNonNullPartition FROM ( SELECT a, p, s, v, m, n, RANK() …

1
ฉันจะรับผลรวมของฟังก์ชันหน้าต่างใน Postgres ได้อย่างไร
ฉันมีตารางที่มีสองคอลัมน์ของพีชคณิต / การรวมกันของอาร์เรย์จำนวนเต็มและคอลัมน์ที่สามที่มีค่าเช่น: CREATE TABLE foo ( perm integer[] NOT NULL, combo integer[] NOT NULL, value numeric NOT NULL DEFAULT 0 ); INSERT INTO foo VALUES ( '{3,1,2}', '{1,2,3}', '1.1400' ), ( '{3,1,2}', '{1,2,3}', '0' ), ( '{3,1,2}', '{1,2,3}', '1.2680' ), ( '{3,1,2}', '{1,2,3}', '0' ), ( '{3,1,2}', '{1,2,3}', '1.2680' …

4
ฉันจะเขียนคิวรีหน้าต่างที่รวมคอลัมน์เพื่อสร้างที่เก็บข้อมูลแยกได้อย่างไร?
ฉันมีตารางที่มีคอลัมน์ของค่าทศนิยมเช่นนี้ id value size -- ----- ---- 1 100 .02 2 99 .38 3 98 .13 4 97 .35 5 96 .15 6 95 .57 7 94 .25 8 93 .15 สิ่งที่ฉันต้องทำให้สำเร็จเป็นเรื่องยากที่จะอธิบายดังนั้นโปรดอดทนด้วย สิ่งที่ผมพยายามทำคือการสร้างมูลค่ารวมของsizeคอลัมน์ที่เพิ่มขึ้นโดยที่ 1 ในแต่ละครั้งแถวก่อนหน้านี้รวมถึง 1 valueเมื่อเรียงลำดับตาม ผลลัพธ์จะเป็นดังนี้: id value size bucket -- ----- ---- ------ 1 100 .02 1 …

1
การเปรียบเทียบประสิทธิภาพระหว่างการใช้ฟังก์ชั่นเข้าร่วมและหน้าต่างเพื่อรับค่านำและระยะเวลาล่าช้า
ผมมีตารางที่มีแถว 20M และแต่ละแถวมี 3 คอลัมน์: time, และid valueสำหรับแต่ละidและtimeมีvalueสถานะ ฉันต้องการทราบว่านำและล่าช้าค่าของบางอย่างสำหรับการที่เฉพาะเจาะจงtimeid ฉันใช้สองวิธีเพื่อให้ได้สิ่งนี้ วิธีการหนึ่งคือการใช้เข้าร่วมและอีกวิธีหนึ่งคือการใช้ฟังก์ชั่นหน้าต่างนำ / ล่าช้ากับดัชนีคลัสเตอร์บนและtimeid ฉันเปรียบเทียบประสิทธิภาพของสองวิธีนี้ตามเวลาดำเนินการ วิธีการเข้าร่วมใช้เวลา 16.3 วินาทีและวิธีฟังก์ชั่นหน้าต่างใช้เวลา 20 วินาทีโดยไม่รวมเวลาในการสร้างดัชนี สิ่งนี้ทำให้ฉันประหลาดใจเพราะฟังก์ชั่นหน้าต่างดูเหมือนจะก้าวหน้าในขณะที่วิธีการเข้าร่วมนั้นดุร้าย นี่คือรหัสสำหรับสองวิธี: สร้างดัชนี create clustered index id_time on tab1 (id,time) เข้าร่วมวิธีการ select a1.id,a1.time a1.value as value, b1.value as value_lag, c1.value as value_lead into tab2 from tab1 a1 left join tab1 b1 …

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.