sql >> データベース >  >> RDS >> Sqlserver

同じ値の3つ以上の連続したレコードを持つレコードを検索します

    トリックを使用して、「現金」トランザクションを列挙できます。このトリックは行番号の違いであり、非常に便利です:

    select t.*
    from (select t.*, count(*) over (partition by grp, customerid, transtype) as cnt
          from (select t.*,
                       (row_number() over (partition by customerid order by date) -
                        row_number() over (partition by customerid, transtype order by date)
                       ) as grp
                from t
               ) t
          where transtype = 'cash'
         ) t
    where cnt >= 3;
    

    これにより、顧客と開始日が返されます。実際のトランザクションを返したい場合は、追加レベルのウィンドウ関数を使用できます。

    select customerid, min(date) as start_date, sum(value) as sumvalue
    from (select t.*,
                 (row_number() over (partition by customerid order by date) -
                  row_number() over (partition by customerid, transtype order by date)
                 ) as grp
          from t
         ) t
    where transtype = 'cash'
    group by grp, transtype, customerid
    having count(*) >= 3;
    


    1. サブクエリSQLから最大データを選択しますが、サブクエリからのすべての結果が表示されます

    2. querydslでmysqlのネストされた/内部関数を呼び出します

    3. PL/SQLによって呼び出されるJavaメソッドを同期する方法

    4. Getdateの出力を変更する