2016-11-13 11 views
1

私は自分のデータで顧客の最大日数を見つけようとしています。特定の顧客が作成した最大の日数は何かを知りたい。誰かが25/8/16 AND 26/08/16 AND 27/08/16 AND 01/09/16 AND 02/09/16で自分のアプリに入ると、最大の順序は3日間です(25,26、 27)。PostgreSQLの日付シーケンスを見つける

最後に(出力)私は2つのフィールドを取得したい:custid | MaxDaySequence

私のデータテーブルには次のフィールドがあります。custid |受注日(timestemp)exmpleについては

custid orderdate 
1 25/08/2007 
1 03/10/2007 
1 13/10/2007 
1 15/01/2008 
1 16/03/2008 
1 09/04/2008 
2 18/09/2006 
2 08/08/2007 
2 28/11/2007 
2 04/03/2008 
3 27/11/2006 
3 15/04/2007 
3 13/05/2007 
3 19/06/2007 
3 22/09/2007 
3 25/09/2007 
3 28/01/2008 

私はPostgreSQLの2014を使用してい

感謝しよう


select custid, max(num_days) as longest 
from ( 
     select custid,rn, count (*) as num_days 
     from (
      select custid, date(orderdate), 
        cast (row_number() over (partition by custid order by date(orderdate)) as varchar(5)) as rn 
      from table_ 
     ) x group by custid, CURRENT_DATE - INTERVAL rn|| ' day' 
) y group by custid 
+0

: Custid、max(num_days)を長時間で選択 から( )num_daysとしてcustid、rn、count(*)を選択 から(table_からrnとして)(xust_date)、(row_number()を(custid order by order by order))varchar(5))をキャストします。 rn || 'day')y グループby custid – RotemY

+0

"Postgres 2014"のようなものはありません。現在のバージョンは9.6です。 'select version()'はあなたに何を表示しますか? –

+0

gcc(GCC)によってコンパイルされたx86_64-unknown-linux-gnuのPostgreSQL 9.4.5 4.8.2 20140120(Red Hat 4.8.2-16)、64ビット – RotemY

答えて

1

してみてください。

SELECT custid, max(abc) as max_sequence_of_days 
FROM (
    SELECT custid, yy, count(*) abc 
    FROM (
    SELECT * , 
      SUM(xx) OVER (partition by custid order by orderdate) yy 
    FROM (
     select * , 
      CASE WHEN 
       orderdate - lag(orderdate) over (partition by custid order by orderdate) 
       <= 1 
     THEN 0 ELSE 1 END xx 
     from mytable 
    ) x 
) z 
    GROUP BY custid, yy 
) q 
GROUP BY custid 

デモ:http://sqlfiddle.com/#!15/00422/11


===== EDIT ===========


ガット「演算子は存在しません。区間< =整数 "

これは、 orderdate列はtimestampで、dateではありません。あなたは<= interval '1' day条件の代わり<= 1使用する必要があります。この場合


は、このリンクを参照してください:PostgreSQLの

での日付計算についての詳細を学ぶためにhttps://www.postgresql.org/docs/9.0/static/functions-datetime.htmlをこのデモをご覧ください。 しようhttp://sqlfiddle.com/#!15/7c2200/2

SELECT custid, max(abc) as max_sequence_of_days 
FROM (
    SELECT custid, yy, count(*) abc 
    FROM (
    SELECT * , 
      SUM(xx) OVER (partition by custid order by orderdate) yy 
    FROM (
     select * , 
      CASE WHEN 
       orderdate - lag(orderdate) over (partition by custid order by orderdate) 
       <= interval '1' day 
     THEN 0 ELSE 1 END xx 
     from mytable 
    ) x 
) z 
    GROUP BY custid, yy 
) q 
GROUP BY custid 
+0

ありがとう!! "演算子が存在しません:間隔<=整数" 間隔でint型としてキャストしようとしましたが、すべてのカスタムで最大値が1になりました – RotemY

+0

答えを更新しました。このエラーは 'orderdate'カラムが日付ではなくタイムスタンプであることを意味します。 – krokodilko

+0

多くのありがとうございます。完璧に働く – RotemY

関連する問題