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

SQLの連続した日

    CTEを使用したこの問題の解決策は次のとおりです。

    WITH RECURSIVE CTE(attendanceDate)
    AS
    (
       SELECT * FROM 
       (
          SELECT attendanceDate FROM attendance WHERE attendanceDate = current_date 
          OR attendanceDate = current_date - INTERVAL '1 day' 
          ORDER BY attendanceDate DESC
          LIMIT 1
       ) tab
       UNION ALL
    
       SELECT a.attendanceDate  FROM attendance a
       INNER JOIN CTE c
       ON a.attendanceDate = c.attendanceDate - INTERVAL '1 day'
    ) 
    SELECT COUNT(*) FROM CTE;
    

    SQLFiddle でコードを確認してください

    クエリの動作は次のとおりです。

    1. attendanceから今日のレコードを選択します テーブル。今日のレコードが利用できない場合は、昨日のレコードが選択されます
    2. その後、最小日の1日前に再帰的にレコードを追加し続けます

    ユーザーの最新の出席時刻(今日、昨日、またはx日前)に関係なく、最新の連続する日付範囲を選択する場合は、CTEの初期化部分を以下のスニペットに置き換える必要があります。

    SELECT MAX(attendanceDate) FROM attendance
    

    [編集]これがあなたの質問を解決するSQLフィドルでのクエリです#1: SQL Fiddle



    1. フォームウィザードを使用してフォームを作成する方法

    2. mySQLデータベース:自動インクリメントフィールドをリセット

    3. PERFMONを介したパフォーマンスカウンターの監視| SQLServerのパフォーマンスのトラブルシューティング-3

    4. 列名の競合をどのように回避しますか?