Разобрать результат курсора Jython в таблицу - PullRequest
0 голосов
/ 05 сентября 2018

Я создал запрос Jython, который возвращает информацию из таблицы красного смещения:

cursor = context.cursor()
cursor.execute('WITH t1 as (SELECT date, partner AS partner, 
revenue AS revenue, avg(revenue)OVER (partition BY 
partner ORDER BY date ROWS BETWEEN 7 preceding AND 1 PRECEDING) as 
"7-day avg"FROM (SELECT date, partner, sum(revenue) as 
revenue FROM data.base GROUP BY date, 
partner))SELECT * FROM t1 WHERE date = CURRENT_DATE - 1 ORDER BY 
revenue DESC')

Тогда:

for item in cursor.fetchall():
    print item

Возвращает:

(datetime.date(2018, 9, 4), u'Disney', 458.171787, 487.70715842857)
(datetime.date(2018, 9, 4), u'Amazon', 142.33, 741.864285714284)
(datetime.date(2018, 9, 4), u'Google', 82.26, 83.510000000002)

Когда у меня возникают проблемы, я превращаю это в таблицу, удобную для чтения человеком, которую можно отправить по электронной почте через SES. В идеале финальная версия должна выглядеть примерно так:

| Date       | Partner | Revenue | Avg    |
|------------|---------|---------|--------|
| 2018-09-04 | Disney  | 458.17  | 487.71 |
| 2018-09-04 | Amazon  | 142.33  | 741.86 |
| 2018-09-04 | Google  | 82.26   | 83.51  |

Еще одним ограничивающим фактором является то, что у меня нет прав для установки пакетов, поэтому я ограничен базовым Jython или Python.

1 Ответ

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

Вот как я смог добраться до нужного мне форматирования:

sample = cursor.fetchall()

#Get maximum length for each variable to create padding
max_partner = max([len(sample[x][1]) for x in range(len(sample))])
max_rev = max([len('${:,.2f}'.format(sample[x][2],2)) for x in range(len(sample))])
max_avg = max([len('${:,.2f}'.format(sample[x][3],2)) for x in range(len(sample))])

#Create column header
subject = "".join(["Date", 7 * " ","| ", 
      "Partner", (max_partner - len("Partner") + 1) * " ","| ", 
      "Revenue", (max_rev - len("Revenue") + 1) * " ","| " 
      "7 Day Avg", "\n", 50 * "-"])

#Generate rows from Redshift query
for item in sample:
    subject += "\n" + str(item[0]) + " | " + \
    item[1] + (max_partner - len(item[1])) * " " + " | " + \
    '${:,.2f}'.format(item[2]) + (max_rev - len('${:,.2f}'.format(item[2],2))) * " " + " | " + \
    '${:,.2f}'.format(item[3])

print subject


Date       | Partner       | Revenue    | 7 Day Avg
--------------------------------------------------
2018-09-09 | Disney        | $854.93    | $824.70
2018-09-09 | Amazon        | $708.48    | $,604.38
2018-09-09 | Google        | $82.05     | $50.11
...