คำถามติดแท็ก aggregate

การรวมจุดข้อมูลหลายจุดไว้ในจุดข้อมูลเดียว โดยปกติจะใช้ในการอ้างอิงถึง SQL และโดยปกติจะใช้กับฟังก์ชันการรวมของการจัดเรียงบางประเภท

2
เหตุใด array_agg () จึงช้ากว่าตัวสร้าง ARRAY ที่ไม่ใช่การรวม ()
ฉันเพิ่งตรวจสอบโค้ดเก่าที่เขียนขึ้นสำหรับPre-8.4 PostgreSQLและฉันเห็นสิ่งที่ดีจริงๆ ฉันจำได้ว่ามีฟังก์ชั่นที่กำหนดเองทำสิ่งนี้ย้อนกลับไปในวัน แต่ฉันลืมสิ่งที่array_agg()ดูเหมือนก่อน สำหรับการตรวจสอบการรวมกลุ่มที่ทันสมัยเขียนขึ้นเช่นนี้ SELECT array_agg(x ORDER BY x DESC) FROM foobar; อย่างไรก็ตามกาลครั้งหนึ่งมันถูกเขียนขึ้นเช่นนี้ SELECT ARRAY(SELECT x FROM foobar ORDER BY x DESC); ดังนั้นฉันลองกับข้อมูลทดสอบบางอย่าง .. CREATE TEMP TABLE foobar AS SELECT * FROM generate_series(1,1e7) AS t(x); ผลลัพธ์น่าประหลาดใจวิธี #OldSchoolCool เร็วขึ้นอย่างมาก: เร่งความเร็ว 25% ยิ่งกว่านั้นการทำให้เรียบง่ายขึ้นโดยไม่มีคำสั่งซื้อแสดงความช้าเหมือนกัน # EXPLAIN ANALYZE SELECT ARRAY(SELECT x FROM foobar); …

4
การคำนวณเปอร์เซ็นต์ของแถวเหนือผลรวมทั้งหมด
ขอโทษสำหรับชื่อที่ไม่ดีฉันไม่แน่ใจว่าชื่อเรื่องนี้จะเป็นอะไรดี นี่คือข้อมูลที่ฉันกำลังทำงานกับ (มุมมองแบบง่าย) ของข้อมูลนี้ Agent | Commission ---------|------------ Smith | 100 Neo | 200 Morpheus | 300 ฉันต้องการคำนวณอัตราร้อยละของค่าคอมมิชชั่นทั้งหมดซึ่งแต่ละตัวแทนมีหน้าที่รับผิดชอบ ดังนั้นสำหรับ Agent Smith เปอร์เซ็นต์จะถูกคำนวณเป็น (Agent Smith's commission / Sum(commission)*100 ดังนั้นข้อมูลที่คาดหวังของฉันจะเป็น Agent | Commission | % Commission ---------|---------------|--------------- Smith | 100 | 17 Neo | 200 | 33 Morpheus | 300 | 50 …

1
เหตุใดกระแสรวมนี้จึงมีความจำเป็น
ลองดูคำถามนี้ มันค่อนข้างง่าย (ดูจุดสิ้นสุดของการโพสต์สำหรับคำจำกัดความของตารางและดัชนีและสคริปต์ที่ซ้ำกัน): SELECT MAX(Revision) FROM dbo.TheOneders WHERE Id = 1 AND 1 = (SELECT 1); หมายเหตุ: "AND 1 = (SELECT 1) เพียงเพื่อป้องกันไม่ให้มีการกำหนดพารามิเตอร์อัตโนมัติซึ่งฉันรู้สึกว่าสับสนปัญหา - จริง ๆ แล้วได้รับแผนเดียวกันโดยมีหรือไม่มีประโยคนั้นแม้ว่า และนี่คือแผน ( วางลิงก์แผน) : เนื่องจากมี "อันดับ 1" อยู่ที่นั่นฉันรู้สึกประหลาดใจที่เห็นผู้ดำเนินการรวมสตรีม ไม่จำเป็นสำหรับฉันเนื่องจากมีการรับประกันว่าจะมีแถวเดียวเท่านั้น เพื่อทดสอบทฤษฎีนั้นฉันลองใช้เคียวรีที่มีเหตุผลเชิงตรรกะนี้: SELECT MAX(Revision) FROM dbo.TheOneders WHERE Id = 1 GROUP BY Id; นี่คือแผนสำหรับแผนนั้น ( …

3
เหตุใดแบบสอบถามรวมจึงเร็วขึ้นอย่างมากเมื่อใช้ GROUP BY clause มากกว่าไม่มี
ฉันแค่อยากรู้ว่าเหตุใดแบบสอบถามโดยรวมจึงทำงานเร็วขึ้นมากโดยมีGROUP BYประโยคมากกว่าไม่มี ตัวอย่างเช่นแบบสอบถามนี้ใช้เวลาเกือบ 10 วินาทีในการเรียกใช้ SELECT MIN(CreatedDate) FROM MyTable WHERE SomeIndexedValue = 1 ในขณะนี้อันนี้ใช้เวลาน้อยกว่าหนึ่งวินาที SELECT MIN(CreatedDate) FROM MyTable WHERE SomeIndexedValue = 1 GROUP BY CreatedDate มีเพียงหนึ่งเดียวCreatedDateในกรณีนี้ดังนั้นคิวรีที่จัดกลุ่มจะส่งคืนผลลัพธ์เดียวกับกลุ่มที่ไม่ได้จัดกลุ่ม ฉันสังเกตเห็นแผนการดำเนินการสำหรับแบบสอบถามที่สองจะแตกต่างกัน - แบบสอบถามที่สองใช้ Parallelism ในขณะที่แบบสอบถามแรกไม่ เป็นเรื่องปกติหรือไม่ที่เซิร์ฟเวอร์ SQL จะประเมินคิวรีแบบรวมแตกต่างกันถ้ามันไม่มี GROUP BY clause? และมีสิ่งที่ฉันสามารถทำได้เพื่อปรับปรุงประสิทธิภาพของแบบสอบถามที่ 1 โดยไม่ต้องใช้GROUP BYคำสั่งหรือไม่ แก้ไข ฉันเพิ่งเรียนรู้ว่าฉันสามารถใช้OPTION(querytraceon 8649)ในการตั้งค่าใช้จ่ายค่าใช้จ่ายของความเท่าเทียมเป็น 0 ซึ่งทำให้แบบสอบถามใช้ความเท่าเทียมและลดรันไทม์เป็น 2 วินาทีแม้ว่าฉันจะไม่รู้ว่ามีข้อเสียในการใช้คำใบ้แบบสอบถามนี้หรือไม่ SELECT MIN(CreatedDate) …

1
เราสามารถใส่เครื่องหมายเท่ากับ (=) หลังจากฟังก์ชั่นรวมใน Transact-SQL ได้หรือไม่?
ฉันได้พบสคริปต์เช่นนี้: set @sum = sum = (case when somecol1 is null then DATEDIFF(d,[somecol2],somecol3) else 0 end) ฉันไม่เข้าใจความหมายของเครื่องหมายเท่ากับ (=) หลังจากรวมคำหลักที่สอง เมื่อฉันเรียกใช้แบบสอบถามจะไม่แสดงข้อผิดพลาดใด ๆ ทั้งที่มีเครื่องหมายเท่ากับและไม่มี sumฉันต้องการที่จะทราบวัตถุประสงค์ของการวางเครื่องหมายเท่ากับหลังจากคำหลัก นั่นเป็นความผิดพลาดหรือไม่? ขอบคุณ

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
แฮชรวม bailout
คำถามที่เกิดขึ้นในการสนทนาการแชท: ฉันรู้ว่าแฮชเข้าร่วม bailout สวิตช์ภายในเพื่อเรียงลำดับของลูปซ้อนกัน SQL Server ทำอะไรให้กับแฮชรวม bailout (ถ้ามันสามารถเกิดขึ้นได้ทั้งหมด)?

2
รับจำนวนที่เพิ่มขึ้นของมูลค่ารวมในตารางที่เข้าร่วม
ฉันมีสองตารางในฐานข้อมูล MySQL 5.7.22: และposts reasonsแต่ละแถวโพสต์มีและอยู่ในหลายเหตุผลแถว แต่ละเหตุผลมีน้ำหนักที่เกี่ยวข้องและดังนั้นแต่ละโพสต์จึงมีน้ำหนักรวมทั้งหมดที่เกี่ยวข้อง สำหรับการเพิ่มน้ำหนักแต่ละจุด 10 คะแนน (เช่น 0, 10, 20, 30, ฯลฯ ) ฉันต้องการรับจำนวนการโพสต์ที่มีน้ำหนักรวมน้อยกว่าหรือเท่ากับการเพิ่มขึ้นนั้น ฉันคาดหวังผลลัพธ์ที่จะมีลักษณะเช่นนี้: weight | post_count --------+------------ 0 | 0 10 | 5 20 | 12 30 | 18 ... | ... 280 | 20918 290 | 21102 ... | ... 1250 | 118005 1260 …

2
การรวมกันอย่างมีประสิทธิภาพ (ลบรายการที่ซ้ำกัน) ของอาร์เรย์
ฉันมีสองตารางและleft2 right2ตารางทั้งสองจะมีขนาดใหญ่ (แถว 1-10M) CREATE TABLE left2(id INTEGER, t1 INTEGER, d INTEGER); ALTER TABLE left2 ADD PRIMARY KEY (id,t1); CREATE TABLE right2( t1 INTEGER, d INTEGER, arr INTEGER[] ); ALTER TABLE right2 ADD PRIMARY KEY(t1,d); ฉันจะทำการค้นหาประเภทนี้: SELECT l.d + r.d, UNIQ(SORT((array_agg_mult(r.arr))) FROM left2 l, right2 r WHERE l.t1 = r.t1 …

2
ส่งคืนการนับสำหรับหลายช่วงในคำสั่ง SELECT เดียว
ฉันมีตารางฐานข้อมูล Postgres fooที่มีคอลัมน์สำหรับscoreช่วงนั้นตั้งแต่ 0 - 10 ฉันต้องการให้แบบสอบถามส่งคืนจำนวนคะแนนทั้งหมดจำนวนคะแนนระหว่าง 0 ถึง 3 จำนวนคะแนนระหว่าง 4 และ 6 และจำนวนคะแนนระหว่าง 7 และ 10 สิ่งที่ชอบดังต่อไปนี้: SELECT COUNT(*) as total, COUNT( SELECT * from foo where score between 0 and 3; ) as low, COUNT( SELECT * from foo where score between 4 and 6; ) as …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.