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

SQLクエリ-クエリ結果の制限

    2つのユーザー変数を使用し、同じ連続するstore_idをカウントすると、<= 5を置き換えることができます。 好きな制限で

    SELECT a.*
    FROM (
     SELECT store_id, user_id, count(1) as visits 
     FROM shopping
     WHERE store_id IN (60,61,62,63,64,65,66)
     GROUP BY store_id, user_id
     ORDER BY store_id, visits desc, user_id
    ) a,
    (SELECT @prev:=-1, @count:=1) b
    WHERE
     CASE WHEN @prev<>a.store_id THEN
       CASE WHEN @prev:=a.store_id THEN
        @count:=1
       END
     ELSE
       @count:[email protected]+1
     END <= 5
    

    説明の要求に応じて編集:

    最初のサブクエリ(a)は、データをグループ化して順序付けするサブクエリであり、次のようなデータが得られます。

    store_id | user_id | visits
    ---------+---------+-------
     60           1       5
     60           2       3
     60           3       1
     61           2       4
     61           3       2
    

    2番目のサブクエリ(b)はユーザー変数@prevを初期化します -1と@count 1で

    次に、サブクエリからすべてのデータを選択します(a)caseの条件を確認します 。

    • 前のstore_id(@prev )これまで見てきたのは、現在のstore_idとは異なります。最初の@prev以降 -1に等しい場合、現在のstore_idに一致するものはないため、条件<> 真の場合、入力するのは、値@prevを変更するだけの2番目のケースです。 現在のstore_idを使用します。これは、2つのユーザー変数@countを変更できるようにするためのトリックです。 および@prev 同じ状態で。

    • 前のstore_idが@prevと等しい場合 @countをインクリメントするだけです 変数。

    • カウントが必要な値の範囲内にあることを確認するため、<= 5

    したがって、テストデータを使用すると:

    step | @prev | @count | store_id | user_id | visits
    -----+-------+--------+----------+---------+-------
      0      -1      1    
      1      60      1        60          1        5 
      2      60      2        60          2        3
      3      60      3        60          3        1
      4      61      1        61          2        4
      5      61      2        61          3        2   
    


    1. OracleとSQLServerのスペースの処理の違い

    2. SQLWHEREステートメント

    3. PostgreSQLでのAcosd()のしくみ

    4. DundasBIでのQuickBooksデータの分析