كيفية الاستعلام عن مجموعة من الكائنات أثناء التجميع حسب خاصية

1

لذا أحاول كتابة استعلام سيحدد مجموعة من الكائنات المميزة في خاصية معينة.

عمل:

+-----+-----------+-----+
| id  | timestamp | ... |
+-----+-----------+-----+
|  10 | 16:04     | ... |
|  11 | 16:06     | ... |
|  12 | 16:08     | ... |
|  13 | 16:09     | ... |
|  14 | 16:10     | ... |
+-----+-----------+-----+

FooVersion:

+----+--------+-----------+-------------------+
| id | foo_id | action_id | foo_zab           |
+----+--------+-----------+-------------------+
|  1 |      1 |        10 | xx                |
|  2 |      2 |        11 | yy                |
|  3 |      3 |        12 | zz                |
|  4 |      3 |        13 | zy                |
|  5 |      3 |        14 | zx                |
+----+--------+-----------+-------------------+

فو:

+----+-----+
| id | zab |
+----+-----+
|  1 | xx  |
|  2 | yy  |
|  3 | zx  |
+----+-----+

يتكون المشهد من مجموعة فوس. أحاول تتبع التغييرات في كل فو معينة بمرور الوقت. لذلك ، في كل مرة يتم فيها إجراء تغيير على foo ، يتم تسجيل الإجراء الذي تسبب في هذا التغيير ويتم تخزين نسخة من بعض خصائص foo في foo_versions الطاولة

إن ما أبحث عنه هو "حالة فوس عند عمل معين". لذا ، في حين أن الإجراء رقم 11 يرتبط على وجه التحديد بـ foo ، فإن حالة المشهد في الإجراء رقم 11 تحتوي بالفعل على 3 فوس ، إصداراتها هي foo_version # 1 و # 2 و # 5

أحتاج إلى إنشاء استعلام يقول "لإجراء محدد ، أعطني تمثيل المشهد"

بالنسبة للعمل رقم 10 ، سيكون المشهد [<foo_version #1>]

بالنسبة للعمل رقم 12 ، سيكون المشهد [<foo_version #1>, <foo_version #2>, <foo_version #3>]

هذا هو المكان الذي تصبح فيه صعبة. بالنسبة للإجراء رقم 14 ، فإن تمثيل المشهد هو [<foo_version #1>, <foo_version #2>, <foo_version #5>] . إصدارات Foo # 3 و # 4 و # 5 تشير جميعها إلى نفس foo. لذا ، يتم استبدال الإصدارين foo # 3 و # 4 بواسطة # 5.

أنا أستخدم هذا الاستعلام sqlalchemy:

stmt = db.session.query(Action).filter(Action.timestamp <= action.timestamp).subquery()
action_alias = aliased(Action, stmt)

foo_versions = db.session.query(FooVersion) \
                         .join(Action) \
                         .join(action_alias, FooVersion.action) \
                         .filter(Action.frame_id == frame.id) \
                         .all()

النتيجة التي أحصل عليها

[<foo_version #1>, <foo_version #2>, <foo_version #3>, <foo_version #4>, <foo_version #5>]]]
                                     |____________|    |____________|
                                           ^                 ^
                                           |                 |
I need to get rid of these versions     -> |                 |
since they have been overwritten 

1 إجابة

-1
افضل جواب

لست على دراية ببايثون ولكن هنا استعلام SQL إذا حصلت بشكل صحيح على ما تريد:

SELECT a.id as action_id, timestamp, 
v.id as version, foo_id, foo_zab
FROM action a
JOIN foo_version v 
ON ( v.action_id IN
  ( 
    SELECT MAX(inner_v.action_id)
    FROM foo_version inner_v 
    WHERE a.id >= inner_v.action_id
    GROUP BY inner_v.foo_id
  )                      
)
JOIN foo ON ( foo.id = v.foo_id ) 
ORDER BY a.id, version

سيعطيك كل صف إجراء متكرر مع بيانات كل إصدار وهنا عرض توضيحي كمان SQL

:مؤلف

أسئلة ذات صلة

فوق
قائمة طعام