5

将来の予測であるトランザクションデータのテーブルがあります。したがって、同じ日付、タイプ、場所、および製品で識別される同じ予測は、時間が経つにつれて予測がより正確になり、再送されるため、複数回読み取られます。

同じタイプで同じ場所、製品、日付のトランザクションをグループ化するクエリを作成し、これらのグループから最新の更新されたタイムスタンプを持つトランザクションのみを選択したいと思います。

テーブルには現在数十万の行があり、時間が経つにつれて数百万になるので、かなり効率的なソリューションをいただければ幸いです:)

表の例:

date    |  location_code   | product_code  | quantity |   type   | updated_at 
------------+------------------+---------------+----------+----------+------------
2013-02-04 | ABC | 123 |  -26.421 | TRANSFER | 2013-01-12
2013-02-07 | ABC | 123 |    -48.1 | SALE | 2013-01-10
2013-02-06 | BCD | 234 |  -58.107 | SALE | 2013-01-11
2013-02-06 | BCD | 234 |      -60 | SALE | 2013-01-10
2013-02-04 | ABC | 123 |   -6.727 | TRANSFER | 2013-01-10

望ましい結果:

date    |  location_code   | product_code  | quantity |   type   | updated_at 
------------+------------------+---------------+----------+----------+------------
2013-02-04 | ABC | 123 |  -26.421 | TRANSFER | 2013-01-12
2013-02-07 | ABC | 123 |    -48.1 | SALE | 2013-01-10
2013-02-06 | BCD | 234 |  -58.107 | SALE | 2013-01-11

私は例えば試しました:

SELECT t.date, t.location_code, t.product_code, t.quantity, t.type, t.updated_at
FROM transactions t
INNER JOIN
(
   SELECT MAX(updated_at) as max_updated_at
   FROM transactions
   GROUP BY product_code, location_code, type, date
) s on t.updated_at=max_updated_at; 

しかし、これには時間がかかり、うまくいかないようです。

お手伝いありがとう!

4

3 に答える 3

4
select distinct on ("date", location_code, product_code, type)
    "date",
    location_code,
    product_code,
    quantity,
    type,
    updated_at
from transactions t
order by t."date", t.location_code, t.product_code, t.type, t.updated_at desc
于 2013-03-16T22:45:34.850 に答える
2

これは、派生テーブルとの結合よりもおそらく効率的です

select *
from (
    select date, 
           location_code, 
           product_code, 
           quantity, 
           type, 
           updated_at, 
           max(updated_at) over (partition by product_code, location_code, type, date) as max_updated
    from transactions
) t
where updated_at = max_updated;
于 2013-03-16T22:49:30.787 に答える
1

Dan Bracukに感謝します!

これは正しいクエリでした:

SELECT t.date, t.location_code, t.product_code, t.quantity, t.type, t.updated_at
FROM transactions t
INNER JOIN
(
   SELECT MAX(updated_at) as max_updated_at, product_code prod, location_code loc, type     typ, date dat
   FROM transactions
   GROUP BY product_code, location_code, type, date
   ) s ON t.updated_at=max_updated_at AND t.location_code=loc AND t.product_code=prod AND  t.type=typ AND t.date=dat;
于 2013-03-16T22:43:54.337 に答える