Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Tìm các bản ghi có 3 hoặc nhiều bản ghi liên tiếp có cùng giá trị

Bạn có thể sử dụng một thủ thuật để liệt kê các giao dịch "tiền mặt". Thủ thuật này là sự khác biệt của số hàng và nó rất hữu ích:

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;

Điều này trả về khách hàng và ngày bắt đầu. Nếu bạn muốn trả lại các giao dịch thực tế, bạn có thể sử dụng một cấp bổ sung của các chức năng cửa sổ:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server 2005 xoay vòng trên số cột không xác định

  2. Điều khoản Check in Where có điều kiện

  3. chuyển đổi dấu thời gian Epoch sang máy chủ sql (định dạng con người có thể đọc được)

  4. Truy vấn SQL Server:Nhanh với Literal nhưng chậm với Variable

  5. Kiểm tra xem một bảng có cột TIMESTAMP trong SQL Server với OBJECTPROPERTY () hay không