Как агрегировать по дням, неделям в pyg флаконе postgresql - PullRequest
0 голосов
/ 04 октября 2019

Я изучаю флягу Python, пытаясь создать небольшое приложение. Я столкнулся с некоторыми проблемами при запросе данных postgresql. Я просмотрел много ссылок о том, как выполнять агрегатную функцию, и попробовал несколько, которые не работают. Было бы здорово, если бы кто-нибудь помог мне найти, где я ошибаюсь. Благодарю. Мой код:

    class DbUtils:
    db_string = "postgresql+psycopg2://postgres:xxx@localhost/postgres"

    def sum_day(self):
        db_string = "postgresql+psycopg2://postgres:xxx@localhost/postgres"
        db = create_engine( db_string )
        results = db.execute( "select current_date, sum(sample2.value),extract('day' from sample2.date_time) as dt from sample2 Group by dt" )
        return results

def sum_week(self):
        db_string = "postgresql+psycopg2://postgres:xxx@localhost/postgres"
        db = create_engine( db_string )
        results = db.execute( "select current_date, sum(sample2.value), extract('week' from sample2.date_time) as dt from sample2 Group by dt" )
        return results

@app.route( '/test/day', methods=['GET'] )
def sum_data():
    value = []
    dbUtils = DbUtils()
    result_Data = dbUtils.sum_day()
    for r in result_Data:
        str_value = str( r[1] ) + ' ' + 'mm'
        json_data = {"Sum_day": str_value, "dated": str(r[0])}
        return Response( json.dumps( json_data ), mimetype='application/json' )

@app.route( '/test/week', methods=['GET'] )
def sum_week():
    value = []
    dbUtils = DbUtils()
    result_Data = dbUtils.sum_week()
    for r in result_Data:
        str_value = str( r[1] ) + ' ' + 'mm'
        json_data = {"Sum_week": str_value, "dated": str(r[0])}
        return Response( json.dumps( json_data ), mimetype='application/json' )

Ожидаемый результат:

{
"Sum_day":  11      #sum of values based on current_date 
"dated": 2019-10-04
}

Но я получаю:

{
"Sum_day":  7       
"dated": 2019-10-04
}

{
"Sum_week": 21       
"dated": 2019-10-04
}

DB_sample2:

value       dated
1           2019-10-01 11:40:29.066806
2           2019-10-01 11:40:29.066806
3           2019-10-03 11:40:29.066806
4           2019-10-03 11:40:29.066806
5           2019-10-04 11:40:29.066806
6           2019-10-04 11:40:29.066806

Я пытался даже с функцией date_trunc, но тот же результат.

Ответы [ 2 ]

0 голосов
/ 08 октября 2019

После изменения полей БД с отметки времени на поле даты. Я выполнил следующий запрос, который дает мне точный результат.
select current_date,sum(sample.value) from sample Where date = current_date select extract('week'from sample.value) from sample

0 голосов
/ 04 октября 2019

Измените


выберите значение current_date, sum (sample2.value), извлечение ('день' из sample2.date_time) как dt из sample2. Группируйте по dt


на


select current_date
, extract('week' from sample2.date_time)
, extract('day' from sample2.date_time)
,  sum(sample2.value), as dt 
from sample2 
Group by current_date
, extract('week' from sample2.date_time)
, extract('day' from sample2.date_time)

добавлено 2019 10 04


Необходимо подсчитать данные в поле даты в данных, а не в текущей дате:


select current_date;

--drop table products2;
CREATE TABLE products2 (
product_no integer,
name text,
price numeric CONSTRAINT positive_price CHECK (price > 0),
date_produced date
);

INSERT INTO products2 VALUES
(1, 'product 01', 105, '2019-10-01' );

INSERT INTO products2 VALUES
(1, 'product 02', 105, '2019-10-02' );

INSERT INTO products2 VALUES
(1, 'product 03', 105, '2019-10-02' );


select * from products2;

select date_produced
, extract('week' from date_produced)
, extract('day' from date_produced)
,  count(product_no)
from products2 
Group by date_produced
, extract('week' from date_produced)
, extract('day' from date_produced)
order by date_produced
, extract('week' from date_produced)
, extract('day' from date_produced)
;




date

1
04.10.2019 00:00:00



product_no
name
price
date_produced

1
1
product 01
105
01.10.2019 00:00:00

2
1
product 02
105
02.10.2019 00:00:00

3
1
product 03
105
02.10.2019 00:00:00



date_produced
date_part
date_part
count

1
01.10.2019 00:00:00
40
1
1

2
02.10.2019 00:00:00
40
2
2
...