PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

एक कंडीशन में उर्फ ​​​​कोलेस का उपयोग करना:कोलेस (अधिकतम (मामला जब मूल्य तब मूल्य) उपनाम के रूप में)

टिप्पणियों में प्रति चर्चा, क्योंकि आप प्रत्येक ad_id की अपेक्षा कर रहे हैं ad_params . में एक ही value होने के लिए प्रति name , हम आपके कोड को नीचे के रूप में फिर से लिख सकते हैं, और आसानी से आवश्यक फ़िल्टर जोड़ सकते हैं:

select ad_media.ad_media_id
, ad_media.ad_id
, ads.name
, action_states.timestamp
, regdate.value AS regdate
, mileage.value AS mileage
, fuel.value AS fuel
, brand.value AS brand
, model.value AS model

from ad_media 
inner join action_states 
    on action_states.ad_id = ad_media.ad_id
inner join ads 
    on ads.ad_id = action_states.ad_id
left join ad_params as regdate --technically we could do an inner join here since we're using this in the WHERE clause now; but I'll leave as an outer join in case you need more advanced logic...
    on regdate.ad_id = ad_media.ad_id
    and regdate.name = 'regdate' 
left join ad_params as mileage
    on mileage.ad_id = ad_media.ad_id
    and mileage.name = 'mileage' 
left join ad_params as fuel
    on fuel.ad_id = ad_media.ad_id
    and fuel.name = 'fuel' 
left join ad_params as brand
    on brand.ad_id = ad_media.ad_id
    and brand.name = 'brand' 
left join ad_params as model
    on model.ad_id = ad_media.ad_id
    and model.name = 'model' 

where action_states.state = 'reg'   
and action_states.action_id = '1' 
and action_states.timestamp::DATE BETWEEN '2018-04-17' AND '2018-04-17'
and ads.category = '2010'   
and regdate.value = '2018' --your condition 

/* --this is probably no longer needed; if it is instead consider adding a `distinct`
group by ad_media.ad_media_id
, ad_media.ad_id
, ads.name
, action_states.timestamp 
order by ad_media.ad_id;
*/

यदि आप अपने मूल SQL को ध्यान में रखते हुए कुछ और चाहते हैं, तो नीचे भी काम करेगा:

select ad_media.ad_media_id
, ad_media.ad_id
, ads.name
, action_states.timestamp
, max(CASE WHEN ad_params.name = 'regdate' THEN ad_params.value END) AS regdate
, max(CASE WHEN ad_params.name = 'mileage' THEN ad_params.value END) AS mileage
, max(CASE WHEN ad_params.name = 'fuel'    THEN ad_params.value END) AS fuel
, max(CASE WHEN ad_params.name = 'brand'   THEN ad_params.value END) AS brand
, max(CASE WHEN ad_params.name = 'model'   THEN ad_params.value END) AS model

from ad_media 
left join action_states 
    on action_states.ad_id = ad_media.ad_id
inner join ads 
    on ads.ad_id = action_states.ad_id
inner join ad_params --since we expect this filter to remove results, we now need it to be an inner join
    ad_params.ad_id = on ad_media.ad_id
    and 
    (
        ad_params.name != 'regdate' --\_i.e. if the value is regdate we want 2018; if it's not regdate we'll take any value
        or ad_params.value = '2018' --/
    )

where action_states.state = 'reg'   
and action_states.action_id = '1' 
and action_states.timestamp::DATE BETWEEN '2018-04-17' AND '2018-04-17'
and ads.category = '2010'   

group by ad_media.ad_media_id
, ad_media.ad_id
, ads.name
, action_states.timestamp 
order by ad_media.ad_id;

हम इसे कई अन्य तरीकों से भी फिर से लिख सकते हैं; लेकिन बीसेट चुनने के लिए हमें आपके स्कीमा और डेटा के बारे में और जानना होगा। यह पोस्ट कुछ उपयोगी संबंधित जानकारी देती है:https://stackoverflow.com/a/7449213/361842 (हालांकि पोस्टग्रेज के बजाय MSSQL पर ध्यान केंद्रित करता है, लेकिन इसी तरह के विचार लागू होते हैं)।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Django के साथ PostgreSQL स्कीमा / नेमस्पेस

  2. PostgreSQL (psql) में सभी डेटाबेस दिखाने के 2 तरीके

  3. पोस्टग्रेज, डुप्लीकेट यूनिक इंडेक्स

  4. पर्ल + पोस्टग्रेएसक्यूएल-- सेलेक्टिव कॉलम टू रो ट्रांसफर

  5. PostgreSQL - JSONB सरणी के प्रत्येक ऑब्जेक्ट में कुंजी जोड़ें