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

Perbedaan antara setiap nilai baris - Jumlah Kesalahan

Yang pada dasarnya Anda butuhkan adalah untuk sementara berpura-pura bahwa c2.reading tidak selesai setelah mencapai 1.000.000, dan itu hanya ketika c2.reading < c1.reading . Artinya, pada saat itu Anda perlu meningkatkan c2.reading dengan 1.000.000, lalu kurangi c1.reading . Dan ketika c2.reading >= c1.reading , kueri harus menghitung perbedaan "normal", yaitu kurangi c1.reading dari c2.reading asli (tidak ditingkatkan) nilai.

Salah satu cara untuk mencapai logika itu adalah dengan melakukan sesuatu yang sederhana seperti ini:

SUM(
  CASE WHEN c2.reading < c1.reading THEN 1000000 ELSE 0 END
  + c2.reading
  - ISNULL(c1.reading, c2.reading)
) AS Count1

Namun, ada juga pendekatan yang berbeda.

Nilai bacaan Anda, dan, sebagai akibatnya, perbedaan di antara keduanya juga, tidak akan pernah melebihi 1.000.000. Oleh karena itu, Anda dapat dengan bebas menerapkan modulo 1.000.000 untuk perbedaan positif dan itu akan memberi Anda perbedaan yang sama kembali:

d mod 1,000,000 = d

Selain itu, menambahkan kelipatan 1.000.000 ke selisih positif tidak akan mempengaruhi hasil modulo 1.000.000 karena, menurut distribusi operasi modulo,

  (d + 1,000,000 * n) mod 1,000,000 =
= d mod 1,000,000 + (1,000,000 * n) mod 1,000,000

Summand pertama, d mod 1,000,000 menghasilkan d , yang kedua, (1,000,000 * n) mod 1,000,000 menghasilkan 0, d + 0 = d .

Di sisi lain, menambahkan 1.000.000 ke negatif perbedaan akan memberi kita perbedaan positif yang benar.

Jadi, kesimpulannya,

  • menambahkan 1.000.000 ke perbedaan negatif memberi kita perbedaan positif (benar),

  • perbedaan positif modulo 1.000.000 menghasilkan perbedaan positif yang sama, dan

  • menambahkan 1.000.000 ke perbedaan positif tidak mempengaruhi hasil modulo 1.000.000.

Dengan mempertimbangkan semua itu, kita bisa mendapatkan ekspresi universal berikut untuk menghitung satu perbedaan:

(1000000 + c2.reading - ISNULL(c1.reading, c2.reading)) % 1000000

dimana % adalah operator modulo di Transact- SQL .

Masukkan ekspresi ke dalam SUM untuk mendapatkan nilai agregat yang sesuai:

SUM((c2.reading + 1000000 - ISNULL(c1.reading, c2.reading)) % 1000000) AS Count1



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kolom Jarang di SQL Server:Dampak pada Waktu &Ruang

  2. Aturan tidak digunakan lagi, apa yang diganti (TSQL)?

  3. Contoh Konversi 'tanggal' ke 'waktu kecil' di SQL Server (T-SQL)

  4. Cara cepat untuk menemukan penggunaan Objek DB di SQL Server 2008?

  5. Bagaimana cara mendapatkan koordinat pembatas untuk kode pos (zip) AS?