मेरे पास तीन कॉलम वाली एक टेबल है: segment_num, pass_num, is_donepass_num (0,1) का एक समुच्चय है। प्रत्येक segment_num के लिए सभी pass_nums (दो बार) का समुच्चय है, जिसका अर्थ है कि प्रत्येक segment_num के लिए 4 पंक्तियाँ हैं। is_done सही या गलत हो सकता है।

segment_num   pass_num   is_done
 1000         0          True
 1000         1                
 1000         0          True   
 1000         1          
     
 1001         0          True
 1001         1              
 1001         0          False
 1001         1          
   
 1002         0          False
 1002         1                
 1002         0          False
 1002         1          

सादगी के लिए, मैंने उन पंक्तियों के लिए is_done फ़ील्ड नहीं भरीं जो मायने नहीं रखतीं। मैं उन सभी segment_num से पूछताछ करना चाहता हूं जिनमें कम से कम एक is_done=True for pass_num 0 है।

तो इस उदाहरण में, १००० और १००१ में कम से कम एक (pass_num=0 और is_done=True) है। तो परिणाम 1000 और 1001 होना चाहिए।

मुझे लगता है कि मुझे प्रत्येक सेगमेंट_नम के लिए group_by का उपयोग करना चाहिए और प्रत्येक समूह में मुझे यह तय करना चाहिए कि क्या सेगमेंट_नम रखना है या इसे पास_नम = 0 के लिए is_done मान के आधार पर अनदेखा करना है। मैं इसे Sqlalchemy ORM में लिखना पसंद करूंगा। किसी भी तरह की सहायता की सच में प्रशंसा की जाएगी।

अब तक मेरे पास यह है:

db.session.query(Mytable).group_by(Mytable.segment_num).all()

मुझे यकीन नहीं है कि इस शर्त को group_by में कैसे जोड़ा जाए।

0
Anne 25 अक्टूबर 2020, 19:44

1 उत्तर

सबसे बढ़िया उत्तर

MySQL में नमूना SQL होगा:

select segment_num from mytable where pass_num=0 and is_done=True group by 
segment_num;

तो इसे SQLAlchemy में करने के लिए

आयात करें और_:

from sqlalchemy import and_

और फिर परिणाम प्राप्त करें:

segments = db.session.query(MyTable.segment_num)
             .filter(and_(MyTable.pass_num == 0,
                          MyTable.is_done == True))
             .group_by(MyTable.segment_num).all()

जो आपको मानों के आधार पर समूहित एकल कॉलम सेगमेंट_नम के लिए मान देगा।

0
dmitryro 25 अक्टूबर 2020, 20:56