SQL Абсолютное значение по столбцам - PullRequest
1 голос
/ 07 октября 2008

У меня есть таблица, которая выглядит примерно так:

word        big   expensive   smart   fast

dog         9     -10         -20     4
professor   2     4           40      -7
ferrari     7     50          0       48
alaska      10    0           1       0
gnat        -3    0           0       0

Значения + и - связаны со словом, поэтому профессор умный, а собака не умная. Аляска большая, как доля от общей стоимости, связанной с ее записями, и обратное верно для комара.

Есть ли хороший способ получить абсолютное значение числа, самого дальнего от нуля, и некоторый токен, является ли абсолютное значение = / = значением? Кроме того, как я могу рассчитать, являются ли результаты для данного значения пропорционально большими по сравнению с другими значениями? Я бы написал что-нибудь для форматирования вывода: «собака: не умная, вероятно, не дорогая; профессор умный; ferrari: быстрая, дорогая; Аляска: большая; (Форматирование не вопрос, просто иллюстрация, я застрял на базовых запросах.)

Кроме того, остальная часть программы - это python, поэтому, если есть какое-либо решение на python с обычными модулями dbapi или более абстрактным модулем, любая помощь приветствуется.

Ответы [ 5 ]

3 голосов
/ 07 октября 2008

Слова перечислены по абсолютному значению большого:

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

итоги по каждой категории:

select sum(abs(big)) as sumbig, 
       sum(abs(expensive)) as sumexpensive,   
       sum(abs(smart)) as sumsmart,
       sum(abs(fast)) as sumfast
  from MyTable;
2 голосов
/ 07 октября 2008

абс значение дальше всего от нуля:

select max(abs(mycol)) from mytbl

будет нулевым, если значение отрицательное:

select n+abs(mycol)
  from zzz
 where abs(mycol)=(select max(abs(mycol)) from mytbl);
1 голос
/ 07 октября 2008

Кажется, проблема в том, что вы в основном хотите работать в одной строке, и на такие вопросы сложно ответить в SQL.

Я бы попытался превратить упомянутую вами структуру в более «атомарную» таблицу фактов, такую ​​как

word property value

либо путем изменения базовой таблицы (если это возможно и если это имеет смысл в отношении остальной части приложения), либо путем определения представления, которое делает это для вас, например

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

Это позволяет запрашивать максимальное значение для каждого слова:

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

Все еще немного неловко, но большая часть логики будет на SQL, а не на выбранном вами языке программирования.

0 голосов
/ 07 октября 2008

Задание вопроса помогло прояснить проблему; Вот функция, которая получает больше от того, что я пытаюсь сделать. Есть ли способ представить некоторые вещи из above2 выше или более эффективный способ сделать в SQL или python то, что я пытаюсь достичь в 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)

Запуск этого дает:

    dog is not smart
    professor is smart
    ferrari is expensive
    alaska is big
    gnat is not big
    >>> 
0 голосов
/ 07 октября 2008

Можете ли вы использовать встроенные агрегатные функции базы данных, такие как MAX (столбец)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...