Valoarea absolută SQL peste coloane

voturi
1

Am un tabel care arată ceva de genul:

cuvânt mare scump inteligent rapid

câine 9 -10 -20 4
profesor 2 4 40 -7
ferrari 7 50 0 48
alaska 10 0 1 0
țînțar -3 0 0 0

+ Și - valorile sunt asociate cu cuvântul, așa că profesorul este inteligent și de câine nu este inteligent. Alaska este mare, ca procent din valoarea totală asociată cu intrările sale, iar opusul este adevărat de țînțari.

Există o modalitate bună de a obține valoarea absolută a numărului cel mai îndepărtat de la zero, iar unele jeton dacă valoarea absolută = / = valoarea? Relatedly, cum s-ar putea calcula dacă rezultatele pentru o anumită valoare sunt proporțional mari în raport cu celelalte valori? Aș scrie ceva pentru a formata ieșire la efectul: „câine: nu inteligent, probabil, nu scump, profesor inteligent, ferrari: rapid, scump; alaska: mare; țânțarul: probabil mici.“ (Formatarea nu este o întrebare, doar o ilustrare, eu sunt blocat pe interogările care stau la baza.)

De asemenea, restul programului este Python, deci, dacă există vreo soluție Python cu module dbapi normale sau un modul mai abstract, orice ajutor apreciat.

Întrebat 07/10/2008 la 06:06
sursa de către utilizator
În alte limbi...                            


5 răspunsuri

voturi
0

Se poate utiliza funcțiile de bază de date agregate încorporate cum ar fi MAX (coloana)?

Publicat 07/10/2008 la 06:22
sursa de către utilizator

voturi
3

Cuvintele enumerate de valoare absolută de mare:

select word, big from myTable order by abs(big)

totaluri pentru fiecare categorie:

select sum(abs(big)) as sumbig, 
       sum(abs(expensive)) as sumexpensive,   
       sum(abs(smart)) as sumsmart,
       sum(abs(fast)) as sumfast
  from MyTable;
Publicat 07/10/2008 la 06:25
sursa de către utilizator

voturi
2

abs valoare fartherest de la zero:

select max(abs(mycol)) from mytbl

va fi zero, în cazul în care valoarea este negativă:

select n+abs(mycol)
  from zzz
 where abs(mycol)=(select max(abs(mycol)) from mytbl);
Publicat 07/10/2008 la 06:28
sursa de către utilizator

voturi
0

Pune întrebarea contribuit la clarificarea problemei; aici este o funcție care devine mai mult la ceea ce am încercat să fac. Există o modalitate de a reprezenta o parte din lucrurile din ¶2 de mai sus, sau un mod mai eficient de a face în SQL sau Python ceea ce am încercat să realizeze în show_distinct?

#!/usr/bin/env python

import sqlite3

conn = sqlite3.connect('so_question.sqlite')
cur = conn.cursor()

cur.execute('create table soquestion (word, big, expensive, smart, fast)')
cur.execute("insert into soquestion values ('dog', 9, -10, -20, 4)")
cur.execute("insert into soquestion values ('professor', 2, 4, 40, -7)")
cur.execute("insert into soquestion values ('ferrari', 7, 50, 0, 48)")
cur.execute("insert into soquestion values ('alaska', 10, 0, 1, 0)")
cur.execute("insert into soquestion values ('gnat', -3, 0, 0, 0)")

cur.execute("select * from soquestion")
all = cur.fetchall()

definition_list = ['word', 'big', 'expensive', 'smart', 'fast']

def show_distinct(db_tuple, def_list=definition_list):
    minimum = min(db_tuple[1:])
    maximum = max(db_tuple[1:])
    if abs(minimum) > maximum:
        print db_tuple[0], 'is not', def_list[list(db_tuple).index(minimum)]
    elif maximum > abs(minimum):
        print db_tuple[0], 'is', def_list[list(db_tuple).index(maximum)]
    else:
        print 'no distinct value'

for item in all:
    show_distinct(item)

Rularea acest lucru dă:

    câine nu este inteligent
    profesor este inteligent
    ferrari este scump
    alaska este mare
    țânțarul nu este mare
    >>> 
Publicat 07/10/2008 la 09:41
sursa de către utilizator

voturi
1

Problema pare să fie că doriți în primul rând să lucreze într-un rând, și acest tip de întrebări sunt greu pentru a răspunde în SQL.

Aș încerca să transforme structura ați menționat într-o mai „atomic“ fapt de masă cum ar fi

word property value

fie prin reproiectarea tabelul de bază (dacă este posibil și în cazul în care are sens în ceea ce privește restul cererii), sau prin definirea o vizualizare care face acest lucru pentru tine, cum ar fi

select word, 'big' as property, big as value from soquestion
UNION ALLL
select word, 'expensive', expensive from soquestion
UNION ALL
...

Acest lucru vă permite să ceri valoarea maximă pentru fiecare cuvânt:

select word, max(value), 
    (select property from soquestion t2 
     where t1.word = t2.word and t2.value = max(t1.value))
from soquestion t1
group by word

Încă un pic ciudat, dar cele mai multe logica va fi în SQL, nu în limba dvs. de programare de alegere.

Publicat 07/10/2008 la 11:39
sursa de către utilizator

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more