سؤال

لدي عامة السؤال الذي سأحاول أن أشرح باستخدام مثال.

أقول لدي جدول مع حقول:"id", "name", "الفئة" ، "المظاهر" و "النسبة"

الفكرة هي أن لدي العديد من البنود من بينها فئة واحدة و "يظهر" عدة مرات.نسبة المجال يجب أن تشمل نسبة كل بند مباراة من إجمالي عدد من المظاهر من العناصر الموجودة في الفئة.

في شبه رمز ما أحتاج إليه هو ما يلي:

  • لكل فئة
    العثور على المبلغ الإجمالي من مباراة البنود ذات الصلة بها.على سبيل المثال يمكن القيام به مع (select sum("appearances") from table group by category)

  • لكل عنصر
    تعيين نسبة قيمة العنصر المظاهر مقسوما على مجموع وجدت لفئة فوق

الآن أنا أحاول أن تحقيق هذا مع واحد استعلام تحديث ، ولكن لا يمكن أن يبدو للقيام بذلك.ما فكرت أن تفعله هو:

update Table T    
set T.ratio = T.appearances /   
(    
select sum(S.appearances)    
from Table S    
where S.id = T.id    
)

ولكن الخلية لا تقبل مستعار تي في العمود التحديث و لم تجد طرق أخرى لتحقيق ذلك.

أي أفكار ؟

هل كانت مفيدة؟

المحلول

بعد الإجابتين اللتين تلقيتهما (لم يكن أي منهما مكتملًا لذا كتبت إجابتي)، ما فعلته في النهاية هو كما يلي:

UPDATE Table AS target
INNER JOIN 
(
select category, appearances_sum
from Table T inner join (
    select category as cat, sum(appearances) as appearances_sum
    from Table
    group by cat
) as agg
where T.category  = agg.cat
group by category
) as source
ON target.category = source.category
SET target.probability = target.appearances / source.appearances_sum 

إنه يعمل بسرعة كبيرة.لقد حاولت أيضًا استخدام استعلام فرعي مرتبط ولكنه كان أبطأ بكثير (مراتب من حيث الحجم)، لذلك أنا متمسك بالربط.

نصائح أخرى

استخدام ينضم بعد التحديث:دليل مرجعي – 13.2.11 تحديث الجملة

لذلك تحديث جدول1 inner join table2 على ....مجموعة جدول1.فو=قيمة حيث table2.bla = someothervalue

مع هذا النوع من الأشياء تبدو دائما في الدليل.الخلية قد السليم دليل مرجعي لذلك لن يكون من الصعب الحصول على الحق في الجملة؛)

هذه هي الطريقة التي يتم بها الأمر في mssql، أعتقد أن mysql هو نفسه أو مشابه:

create table T (id int, ratio float, appearances int)
insert T values (1, null, 2)
insert T values (1, null, 3)

update T
set ratio = cast(appearances as float)/ agg.appearancesSum
from T join (
    select id, sum(appearances) as appearancesSum
    from T
    group by id
) as agg on t.id = agg.id
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top