Примеры групп SQL - PullRequest
       12

Примеры групп SQL

0 голосов
/ 05 сентября 2018

У меня есть база данных sqlite, которую я могу прочитать как:

In [42]: df = pd.read_sql("SELECT * FROM all_vs_all", engine)                                                                                                                                                   


In [43]:                                                                                                                                                                                                        
In [43]: df.head()                                                                                                                                                                                              
Out[43]:                                                                                                                                                                                                        
                             user_data                           user_model  \                                                                                                                                  
0  037d05edbbf8ebaf0eca@172.16.199.165  037d05edbbf8ebaf0eca@172.16.199.165                                                                                                                                     
1  037d05edbbf8ebaf0eca@172.16.199.165   060210bf327a3e3b4621@172.16.199.33                                                                                                                                     
2  037d05edbbf8ebaf0eca@172.16.199.165   1141259bd36ba65bef02@172.21.44.180                                                                                                                                     
3  037d05edbbf8ebaf0eca@172.16.199.165  209627747e2af1f6389e@172.16.199.181                                                                                                                                     
4  037d05edbbf8ebaf0eca@172.16.199.165  303a1aff4ab6e3be82ab@172.21.112.182                                                                                                                                     

      score  Class   time_secs model_name  bin_id                                                                                                                                                               
0  0.283141      0  1514764800       Flow       0                                                                                                                                                               
1  0.999300      1  1514764800       Flow       0                                                                                                                                                               
2  1.000000      1  1514764800       Flow       0                                                                                                                                                               
3  0.206360      1  1514764800       Flow       0                                                                                                                                                               
4  1.000000      1  1514764800       Flow       0                                                                                                                                                               

Поскольку таблица слишком большая, я вместо чтения полной таблицы выбираю случайное подмножество строк:

Это можно сделать очень быстро, как:

 random_query = "SELECT * FROM all_vs_all WHERE abs(CAST(random() AS REAL))/9223372036854775808 < %f AND %s" % (ratio, time_condition)                                                                       
    df = pd.read_sql(random_query, engine)                                                                                                                                                                      

Проблема в том, что для каждого триплета [user_data, user_model, time_secs] я хочу получить все строки, содержащие этот триплет. Каждый триплет появляется 1 или 2 раза.

Возможный способ сделать это - сначала выбрать случайный набор триплетов, а затем получить все строки, которые имеют один из выбранных триплетов, но это кажется слишком медленным.

Есть ли эффективный способ сделать это?

РЕДАКТИРОВАТЬ: Если бы я мог загрузить все данные в пандах, я бы сделал что-то вроде:

selected_groups = []
for group in df.groupby(['user_data', 'user_model', 'time_secs']):
    if np.random.uniform(0,1) > ratio:
       selected_groups.append(group)
res = pd.concat(selected_groups)

1 Ответ

0 голосов
/ 19 декабря 2018

Несколько примеров соединения и SQL-запроса:

в настоящее время признано:

Select p.patient_no, p.pat_name,p.date_admitted,r.room_extension,p.date_discharged FROM Patient p JOIN room r ON p.room_location = r.room_location where p.date_discharged IS NULL ORDER BY p.patient_no,p.pat_name,p.date_admitted,r.room_extension,p.date_discharged;

свободных номеров:

SELECT r.room_location, r.room_accomadation, r.room_extension FROM room r where r.room_location NOT IN (Select p.room_location FROM patient.p where p.date_discharged IS NULL) ORDER BY r.room_location, r.room_accomadation, r.room_extension;

пока нет зарядов:

SELECT p.patient_no, p.pat_name, COALESCE (b.charge,0.00) charge FROM patient p LEFT JOIN billed b on p.patient_no = b.patient_no WHERE p.patient_no NOT IN (SELECT patient_no FROM billed) group by p.patient_no ORDER BY p.patient_no, p.pat_name,charge;

Макс саларизован:

SELECT phy_id,phy_name, salary FROM physician where salary in (SELECT MAX(salary) FROM physician) UNION
SELECT phy_id,phy_name, salary FROM physician where salary in (SELECT MIN(salary) FROM physician) ORDER BY phy_id,phy_name, salary;

различные предметы, потребляемые:

select p.pat_name, i.discription, count (i.item code) as item code from patient p join billed b on p.patient no = b. patient no join item i on b.item code = i.item code group by p.patient no, i.item code order by..

пациент не получает лечение:

 SELECT p.patient_no,p.pat_name FROM patient p where p.patient_no NOT IN (SELECT t.patient_no FROM treats t) 
ORDER BY p.patient_no,p.pat_name;

2 высокооплачиваемых:

Select phy_id, phy_name, date_of_joining, max(salary) as salary from physician group by salary having salary IN (Select salary from physician)
Order by phy_id, phy_name, date_of_joining, salary limit 2;

свыше 200:

select patient_no, sum (charge), as total charge from billed group by patient no having total charges > 200 order by patient no, total charges
...