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

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

5
การจัดเก็บ vs การคำนวณค่ารวม
มีแนวทางหรือกฎง่ายๆในการพิจารณาว่าจะเก็บค่ารวมและเมื่อใดในการคำนวณพวกเขาได้ทันทีหรือไม่ ตัวอย่างเช่นสมมติว่าฉันมีวิดเจ็ตที่ผู้ใช้สามารถให้คะแนน (ดูสคีมาด้านล่าง) ทุกครั้งที่ฉันแสดงวิดเจ็ตฉันสามารถคำนวณคะแนนผู้ใช้เฉลี่ยจากRatingsตาราง อีกทางเลือกหนึ่งฉันสามารถเก็บคะแนนเฉลี่ยบนWidgetโต๊ะ สิ่งนี้จะช่วยให้ฉันไม่ต้องคำนวณการจัดอันดับทุกครั้งที่ฉันแสดงวิดเจ็ต แต่จากนั้นฉันจะต้องคำนวณคะแนนเฉลี่ยใหม่ทุกครั้งที่ผู้ใช้ให้คะแนนวิดเจ็ต Ratings Widgets --------- ------- widget_id widget_id user_id name rating avg_rating <--- The column in question

4
ความแตกต่างระหว่างจำนวนที่เลือก (*) และจำนวนที่เลือก (any_non_null_column) คืออะไร
ฉันดูเหมือนจะจำไว้ว่า (ใน Oracle) มีความแตกต่างระหว่างการเปล่งเสียงและselect count(*) from any_tableselect count(any_non_null_column) from any_table อะไรคือความแตกต่างระหว่างสองข้อความนี้ถ้ามี?
58 oracle  aggregate  count  null 

7
การเขียนโครงสร้างธนาคารอย่างง่าย: ฉันจะรักษายอดคงเหลือของฉันให้สอดคล้องกับประวัติการทำธุรกรรมได้อย่างไร
ฉันกำลังเขียนคีสำหรับฐานข้อมูลธนาคารที่เรียบง่าย นี่คือคุณสมบัติพื้นฐาน: ฐานข้อมูลจะเก็บธุรกรรมกับผู้ใช้และสกุลเงิน ผู้ใช้ทุกคนมียอดดุลหนึ่งรายการต่อหนึ่งสกุลเงินดังนั้นแต่ละยอดดุลเป็นเพียงผลรวมของธุรกรรมทั้งหมดต่อผู้ใช้และสกุลเงิน ยอดคงเหลือต้องไม่ติดลบ แอปพลิเคชันธนาคารจะสื่อสารกับฐานข้อมูลผ่านขั้นตอนการจัดเก็บ ฉันคาดหวังว่าฐานข้อมูลนี้จะยอมรับการทำธุรกรรมใหม่หลายแสนรายการต่อวันรวมทั้งคำสั่งยอดคงเหลือในลำดับความสำคัญที่สูงขึ้น ในการให้บริการยอดคงเหลืออย่างรวดเร็วฉันต้องรวมไว้ล่วงหน้า ในเวลาเดียวกันฉันต้องรับประกันว่ายอดเงินจะไม่ขัดแย้งกับประวัติการทำธุรกรรม ตัวเลือกของฉันคือ: มีbalancesตารางแยกต่างหากและทำสิ่งใดสิ่งหนึ่งต่อไปนี้: ใช้ธุรกรรมกับทั้งtransactionsและbalancesตาราง ใช้TRANSACTIONตรรกะในเลเยอร์ของโพรซีเดอร์ที่เก็บไว้เพื่อให้แน่ใจว่ายอดคงเหลือและการทำธุรกรรมมีการซิงค์อยู่เสมอ (รองรับโดยแจ็ค ) ใช้ธุรกรรมกับtransactionsตารางและมีทริกเกอร์ที่อัปเดตbalancesตารางให้ฉันด้วยจำนวนธุรกรรม ใช้ธุรกรรมกับbalancesตารางและมีทริกเกอร์ที่เพิ่มรายการใหม่ในtransactionsตารางให้ฉันด้วยจำนวนธุรกรรม ฉันต้องพึ่งพาวิธีการรักษาความปลอดภัยเพื่อให้แน่ใจว่าไม่มีการเปลี่ยนแปลงใด ๆ นอกกระบวนการที่เก็บไว้ มิฉะนั้นตัวอย่างเช่นกระบวนการบางอย่างสามารถแทรกธุรกรรมลงในtransactionsตารางโดยตรงและภายใต้โครงการ1.3ยอดคงเหลือที่เกี่ยวข้องจะไม่ซิงค์กัน มีbalancesมุมมองที่จัดทำดัชนีที่รวมการทำธุรกรรมอย่างเหมาะสม เครื่องมือเก็บข้อมูลรับประกันยอดคงเหลือเพื่อให้สอดคล้องกับการทำธุรกรรมของพวกเขาดังนั้นฉันไม่จำเป็นต้องพึ่งพาวิธีการรักษาความปลอดภัยเพื่อรับประกันสิ่งนี้ ในทางกลับกันฉันไม่สามารถบังคับยอดคงเหลือให้เป็นค่าที่ไม่เป็นลบได้อีกต่อไปนับตั้งแต่การดู - แม้แต่การดูที่มีการจัดทำดัชนี - ไม่สามารถมีCHECKข้อ จำกัด ได้ (สนับสนุนโดยDenny ) มีเพียงtransactionsตารางแต่มีคอลัมน์เพิ่มเติมเพื่อจัดเก็บยอดคงเหลือที่มีประสิทธิภาพหลังจากทำรายการนั้นแล้ว ดังนั้นบันทึกธุรกรรมล่าสุดสำหรับผู้ใช้และสกุลเงินจึงมียอดดุลปัจจุบัน (แนะนำโดยAndrewด้านล่าง; ตัวแปรที่เสนอโดยgarik ) ครั้งแรกที่ผมจัดการปัญหานี้ผมอ่านเหล่านี้ สอง2การอภิปรายและการตัดสินใจในตัวเลือก สำหรับการอ้างอิงคุณสามารถดูการดำเนินงานที่เปลือยกระดูกของมันนี่ คุณออกแบบหรือจัดการฐานข้อมูลเช่นนี้ด้วยโปรไฟล์การโหลดสูงหรือไม่ คุณมีวิธีแก้ไขปัญหานี้อย่างไร คุณคิดว่าฉันได้เลือกการออกแบบที่ถูกต้องหรือไม่? มีอะไรบ้างที่ฉันควรจำไว้? ตัวอย่างเช่นฉันรู้ว่าการเปลี่ยนสคีมาในtransactionsตารางจะต้องมีการสร้างbalancesมุมมองใหม่ แม้ว่าฉันจะเก็บถาวรธุรกรรมเพื่อทำให้ฐานข้อมูลมีขนาดเล็ก (เช่นย้ายไปที่อื่นและแทนที่ด้วยธุรกรรมสรุป) การสร้างมุมมองใหม่จากการทำธุรกรรมหลายสิบล้านครั้งด้วยการปรับปรุง schema ทุกครั้งอาจหมายถึงการหยุดทำงานต่อการปรับใช้ …

14
กำจัดรายการที่ซ้ำกันใน ListAgg (Oracle)
ก่อนหน้า Oracle 11.2 ฉันใช้ฟังก์ชันการรวมแบบกำหนดเองเพื่อต่อคอลัมน์เข้ากับแถว 11.2 เพิ่มLISTAGGฟังก์ชั่นดังนั้นฉันพยายามจะใช้มันแทน ปัญหาของฉันคือฉันต้องกำจัดรายการที่ซ้ำกันในผลลัพธ์และดูเหมือนจะไม่สามารถทำได้ นี่คือตัวอย่าง CREATE TABLE ListAggTest AS ( SELECT rownum Num1, DECODE(rownum,1,'2',to_char(rownum)) Num2 FROM dual CONNECT BY rownum<=6 ); SELECT * FROM ListAggTest; NUM1 NUM2 ---------- --------------------- 1 2 2 2 << Duplicate 2 3 3 4 4 5 5 6 6 สิ่งที่ฉันต้องการเห็นคือ: NUM1 NUM2S …

5
ฉันจะใช้ค่าเริ่มต้นในแบบสอบถามแบบใช้เลือกข้อมูลใน PostgreSQL ได้อย่างไร
ฉันต้องการใช้ค่าเริ่มต้นสำหรับคอลัมน์ที่ควรใช้หากไม่มีการส่งคืนแถว เป็นไปได้ใน PostgreSQL? ฉันจะทำมันได้อย่างไร หรือมีวิธีอื่นที่ฉันสามารถแก้ไขได้? เช่นบางสิ่งเช่นนี้ SELECT MAX(post_id) AS max_id DEFAULT 0 FROM my_table WHERE org_id = 3 และถ้าไม่มีแถวที่มีในตารางผมต้องการที่จะกลับมาorg_id = 30

7
วิธีที่มีประสิทธิภาพที่สุดในการรับจำนวนคอลัมน์ขั้นต่ำใน SQL Server 2005 คืออะไร
ฉันอยู่ในสถานการณ์ที่ฉันต้องการรับค่าต่ำสุดจาก 6 คอลัมน์ ฉันได้พบสามวิธีในการบรรลุเป้าหมายนี้ แต่ฉันมีความกังวลเกี่ยวกับประสิทธิภาพของวิธีการเหล่านี้และต้องการทราบว่าวิธีไหนที่จะดีกว่าสำหรับการแสดง วิธีแรกคือการใช้คำสั่งคดีใหญ่ นี่คือตัวอย่างที่มี 3 คอลัมน์ตามตัวอย่างในลิงก์ด้านบน คำสั่ง case ของฉันจะนานกว่านี้เพราะฉันจะดูที่ 6 คอลัมน์ Select Id, Case When Col1 <= Col2 And Col1 <= Col3 Then Col1 When Col2 <= Col3 Then Col2 Else Col3 End As TheMin From MyTable ตัวเลือกที่สองคือการใช้ประกอบกับงบเลือกหลายUNION ฉันจะใส่สิ่งนี้ใน UDF ที่ยอมรับพารามิเตอร์ Id select Id, dbo.GetMinimumFromMyTable(Id) from MyTable …

3
เหตุใด ANSI SQL จึงกำหนด SUM (ไม่มีแถว) เป็น NULL
กำหนด ANSI SQL มาตรฐาน (บทที่ 6.5 เปฟังก์ชั่นชุด) พฤติกรรมต่อไปนี้สำหรับฟังก์ชันการรวมในชุดผลลัพธ์ที่ว่างเปล่า COUNT(...) = 0 AVG(...) = NULL MIN(...) = NULL MAX(...) = NULL SUM(...) = NULL การส่งคืนค่า NULL สำหรับ AVG, MIN และ MAX เหมาะสมอย่างยิ่งเนื่องจากค่าเฉลี่ยค่าต่ำสุดและค่าสูงสุดของชุดว่างเปล่านั้นไม่ได้ถูกกำหนด อย่างไรก็ตามอันสุดท้าย, ทำให้ฉันรำคาญใจ: ในทางคณิตศาสตร์, SUM ของเซตว่างนั้นถูกนิยามไว้อย่างดี: 0. การใช้ 0 องค์ประกอบที่เป็นกลางของการเติมเนื่องจากเคสฐานทำให้ทุกอย่างสอดคล้องกัน: SUM({}) = 0 = 0 SUM({5}) = 5 = 0 …

4
การใช้ HAVING ที่ไม่มี GROUP BY ในการสืบค้น SQL
เพื่อที่จะใช้HAVINGในการสืบค้น SQL จะต้องมีการGROUP BYรวมชื่อคอลัมน์หรือไม่ มีกรณีพิเศษที่สามารถใช้งานได้HAVINGโดยไม่ต้องมีGROUP BYแบบสอบถาม SQL หรือไม่? พวกเขาจะต้องอยู่ร่วมกันในเวลาเดียวกันหรือไม่?
26 aggregate 

3
Access (Jet) SQL: DateTime stamps ใน TableB ขนาบแต่ละ DateTime stamp ใน TableA
คำแรก คุณสามารถละเว้นส่วนด้านล่าง (และรวมถึง) อย่างปลอดภัยเข้าร่วม: เริ่มต้นปิดถ้าคุณเพียงแค่ต้องการที่จะถอดรหัสรหัส พื้นหลังและผลเพียงทำหน้าที่เป็นบริบท โปรดดูประวัติการแก้ไขก่อน 2015-10-06 หากคุณต้องการดูว่ารหัสดูเหมือนเป็นครั้งแรก วัตถุประสงค์ ในท้ายที่สุดผมต้องการที่จะคำนวณพิกัด GPS หยันสำหรับเครื่องส่งสัญญาณ ( XหรือXmit) ตามแสตมป์วันที่และเวลาของข้อมูลจีพีเอสที่มีอยู่ในตารางที่ด้านข้างโดยตรงสังเกตในตารางSecondTableFirstTable เป้าหมายทันทีของฉันในการบรรลุเป้าหมายสูงสุดคือการหาวิธีเข้าร่วมFirstTableให้ดีที่สุดSecondTableเพื่อรับคะแนนเวลาขนาบข้างนั้น ต่อมาฉันสามารถใช้ข้อมูลนั้นได้ฉันสามารถคำนวณพิกัด GPS ระดับกลางโดยสมมติว่าการปรับตำแหน่งเชิงเส้นตามระบบพิกัดแบบคู่ขนาน (คำที่น่าประหลาดใจที่จะบอกว่าฉันไม่สนใจว่าโลกเป็นทรงกลมในระดับนี้) คำถาม มีวิธีที่มีประสิทธิภาพมากกว่าในการสร้างการประทับเวลาก่อนและหลังที่ใกล้เคียงที่สุดหรือไม่ แก้ไขด้วยตัวเองโดยเพียงแค่คว้า "หลัง" แล้วรับ "ก่อน" เฉพาะเมื่อมันเกี่ยวข้องกับ "หลัง" มีวิธีที่ง่ายกว่าที่ไม่เกี่ยวข้องกับ(A<>B OR A=B)โครงสร้างหรือไม่ Byrdzeyeให้ทางเลือกพื้นฐาน แต่ประสบการณ์ "โลกแห่งความจริง" ของฉันไม่ตรงกับกลยุทธ์การเข้าร่วมทั้ง 4 ของเขาที่ทำแบบเดียวกัน แต่ให้เครดิตเต็มที่กับเขาสำหรับการระบุสไตล์การเข้าร่วมอื่น ความคิดเทคนิคและคำแนะนำอื่น ๆ ที่คุณมี ดังนั้นไกลทั้งbyrdzeyeและPhrancisค่อนข้างมีประโยชน์ในเรื่องนี้ ฉันพบว่าคำแนะนำของ Phrancisถูกจัดวางอย่างยอดเยี่ยมและให้ความช่วยเหลือในช่วงวิกฤติดังนั้นฉันจะให้เขาได้เปรียบที่นี่ ฉันยังคงขอขอบคุณความช่วยเหลือเพิ่มเติมใด ๆ ที่ฉันสามารถรับได้ในเรื่องข้อ 3 Bulletpoints …

3
ใน PostgreSQL มีฟังก์ชั่นรวมที่ปลอดภัยชนิดแรก () หรือไม่?
คำถามแบบเต็มเขียนใหม่ ฉันกำลังมองหาฟังก์ชันการรวมครั้งแรก () ที่นี่ฉันพบบางสิ่งที่เกือบจะได้ผล: CREATE OR REPLACE FUNCTION public.first_agg ( anyelement, anyelement ) RETURNS anyelement LANGUAGE sql IMMUTABLE STRICT AS $$ SELECT $1; $$; -- And then wrap an aggregate around it CREATE AGGREGATE public.first ( sfunc = public.first_agg, basetype = anyelement, stype = anyelement ); ปัญหาคือเมื่อคอลัมน์ varchar (n) ผ่านฟังก์ชั่นแรก …

1
ผลรวมกลิ้ง / นับ / เฉลี่ยในช่วงวันที่
ในฐานข้อมูลของธุรกรรมที่ครอบคลุม 1,000 กิจการในระยะเวลา 18 เดือนฉันต้องการเรียกใช้แบบสอบถามเพื่อจัดกลุ่มทุกช่วงเวลา 30 วันที่เป็นไปได้โดยentity_idใช้ SUM ของจำนวนธุรกรรมและ COUNT ของธุรกรรมในช่วง 30 วันนั้นและ คืนค่าข้อมูลในวิธีที่ฉันสามารถสอบถามได้ หลังจากการทดสอบจำนวนมากรหัสนี้บรรลุสิ่งที่ฉันต้องการ: SELECT id, trans_ref_no, amount, trans_date, entity_id, SUM(amount) OVER(PARTITION BY entity_id, date_trunc('month',trans_date) ORDER BY entity_id, trans_date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS trans_total, COUNT(id) OVER(PARTITION BY entity_id, date_trunc('month',trans_date) ORDER BY entity_id, trans_date ROWS BETWEEN …

4
การรวมช่วงแยกเป็นช่วงที่ใหญ่ที่สุดที่เป็นไปได้
ฉันกำลังพยายามรวมช่วงวันที่หลายช่วง (การโหลดของฉันมีค่าสูงสุด 500 กรณีส่วนใหญ่ 10) ที่อาจหรือไม่ทับซ้อนกับช่วงวันที่ต่อเนื่องที่ใหญ่ที่สุดที่เป็นไปได้ ตัวอย่างเช่น: ข้อมูล: CREATE TABLE test ( id SERIAL PRIMARY KEY NOT NULL, range DATERANGE ); INSERT INTO test (range) VALUES (DATERANGE('2015-01-01', '2015-01-05')), (DATERANGE('2015-01-01', '2015-01-03')), (DATERANGE('2015-01-03', '2015-01-06')), (DATERANGE('2015-01-07', '2015-01-09')), (DATERANGE('2015-01-08', '2015-01-09')), (DATERANGE('2015-01-12', NULL)), (DATERANGE('2015-01-10', '2015-01-12')), (DATERANGE('2015-01-10', '2015-01-12')); ตารางดูเหมือนว่า: id | range ----+------------------------- 1 | [2015-01-01,2015-01-05) …

3
ผลลัพธ์ที่ถูกต้องสำหรับแบบสอบถามนี้คืออะไร
ฉันเจอปริศนานี้ในความคิดเห็นที่นี่ CREATE TABLE r (b INT); SELECT 1 FROM r HAVING 1=1; SQL ServerและPostgreSQLส่งคืน 1 แถว MySQLและOracleคืนค่าศูนย์แถว อันไหนถูกต้อง? หรือทั้งสองอย่างนั้นถูกต้องเท่าเทียมกัน?

2
SQL Server ส่งคืน“ ข้อผิดพลาดทางคณิตศาสตร์มากเกินไปในการแปลงนิพจน์เป็นชนิดข้อมูล int”
เมื่อฉันเรียกใช้คำสั่งนี้ด้วย SUM() SELECT COUNT(*) AS [Records], SUM(t.Amount) AS [Total] FROM dbo.t1 AS t WHERE t.Id > 0 AND t.Id < 101; ฉันได้รับ, Arithmetic overflow error converting expression to data type int. ความคิดเกี่ยวกับสาเหตุของมันคืออะไร? ฉันแค่ทำตามคำแนะนำในคำตอบนี้

1
ข้อผิดพลาด Postgres [คอลัมน์จะต้องปรากฏในกลุ่มตามข้อหรือใช้ในฟังก์ชั่นรวม] เมื่อใช้แบบสอบถามย่อย
ฉันมีสองตารางและemployee phonesพนักงานสามารถมีหมายเลขโทรศัพท์ 0 ถึง n ฉันต้องการแสดงชื่อพนักงานพร้อมหมายเลขโทรศัพท์ ฉันใช้แบบสอบถามด้านล่างซึ่งทำงานได้ดี SELECT empname,array_agg(phonenumber) AS phonenumbers FROM employee LEFT OUTER JOIN phones ON employee.empid = phones.empid GROUP BY employee.empid ตารางพนักงานอาจมีแถวจำนวนมาก ฉันต้องการเรียกพนักงานเพียงบางคนในเวลาเดียวกัน ตัวอย่างเช่นฉันต้องการเรียกพนักงาน 3 คนด้วยหมายเลขโทรศัพท์ของพวกเขา ฉันพยายามเรียกใช้แบบสอบถามนี้ SELECT empname,array_agg(phonenumber) AS phonenumbers FROM (SELECT * FROM employee ORDER BY empname LIMIT 3 OFFSET 0) AS employee LEFT OUTER …

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