Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Klausa SQL OVER() - kapan dan mengapa ini berguna?

Anda bisa gunakan GROUP BY SalesOrderID . Perbedaannya adalah, dengan GROUP BY Anda hanya dapat memiliki nilai agregat untuk kolom yang tidak termasuk dalam GROUP BY.

Sebaliknya, menggunakan fungsi agregat berjendela alih-alih GROUP BY, Anda dapat mengambil nilai agregat dan non-agregat. Artinya, meskipun Anda tidak melakukannya dalam kueri contoh, Anda dapat mengambil OrderQty individu nilai dan jumlah, hitungan, rata-rata, dll. pada grup SalesOrderID yang sama s.

Berikut adalah contoh praktis mengapa agregat berjendela bagus. Misalkan Anda perlu menghitung berapa persen dari total setiap nilai. Tanpa agregat berjendela, Anda harus terlebih dahulu mendapatkan daftar nilai agregat dan kemudian menggabungkannya kembali ke rowset asli, yaitu seperti ini:

SELECT
  orig.[Partition],
  orig.Value,
  orig.Value * 100.0 / agg.TotalValue AS ValuePercent
FROM OriginalRowset orig
  INNER JOIN (
    SELECT
      [Partition],
      SUM(Value) AS TotalValue
    FROM OriginalRowset
    GROUP BY [Partition]
  ) agg ON orig.[Partition] = agg.[Partition]

Sekarang lihat bagaimana Anda dapat melakukan hal yang sama dengan agregat berjendela:

SELECT
  [Partition],
  Value,
  Value * 100.0 / SUM(Value) OVER (PARTITION BY [Partition]) AS ValuePercent
FROM OriginalRowset orig

Jauh lebih mudah dan bersih, bukan?



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ambil definisi kolom untuk kumpulan hasil prosedur tersimpan

  2. Pantau Harapan Hidup Halaman di SQL Server

  3. Bagaimana cara mengubah bahasa default untuk SQL Server?

  4. Bagaimana Mengidentifikasi duplikasi kunci utama dari kode kesalahan SQL Server 2008?

  5. Menyisipkan baris ke dalam tabel dengan satu kolom IDENTITAS saja