Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

MSSQL डेटाबेस तालिका से निकटतम देशांतर और अक्षांश प्राप्त करें?

आइए STDistance . का उपयोग करने का एक सरल उदाहरण देखें SQL सर्वर 2008 (और बाद में) में कार्य करता है।

मैं SQL सर्वर को बताने जा रहा हूँ कि मैं लंदन में हूँ, और मैं देखना चाहता हूँ कि मेरा प्रत्येक कार्यालय कितनी दूर है। यहां वे परिणाम दिए गए हैं जो मैं चाहता हूं कि SQL सर्वर मुझे दे:

सबसे पहले, हमें कुछ नमूना डेटा की आवश्यकता होगी। हम Microsoft कार्यालयों के कुछ स्थानों वाली एक तालिका बनाएंगे, और हम उनके देशांतर और अक्षांश मानों को geography में संग्रहीत करेंगे। फ़ील्ड.

CREATE TABLE [Offices] (
    [Office_Id] [int] IDENTITY(1, 1) NOT NULL,
    [Office_Name] [nvarchar](200) NOT NULL,
    [Office_Location] [geography] NOT NULL,
    [Update_By] nvarchar(30) NULL,
    [Update_Time] [datetime]
) ON [PRIMARY]

GO

INSERT INTO [dbo].[Offices] VALUES ('Microsoft Zurich', 'POINT(8.590847 47.408860 )', 'mike', GetDate())
INSERT INTO [dbo].[Offices] VALUES ('Microsoft San Francisco', 'POINT(-122.403697 37.792062 )', 'mike', GetDate())
INSERT INTO [dbo].[Offices] VALUES ('Microsoft Paris', 'POINT(2.265509 48.833946)', 'mike', GetDate())
INSERT INTO [dbo].[Offices] VALUES ('Microsoft Sydney', 'POINT(151.138378 -33.796572)', 'mike', GetDate())
INSERT INTO [dbo].[Offices] VALUES ('Microsoft Dubai', 'POINT(55.286282 25.228850)', 'mike', GetDate())

अब मान लीजिए हम लंदन में हैं। geography बनाने का तरीका यहां दिया गया है लंदन के देशांतर और अक्षांश मानों में से मान:

DECLARE 
    @latitude numeric(12, 7),
    @longitude numeric(12, 7)

SET @latitude = 51.507351
SET @longitude = -0.127758

DECLARE @g geography = 'POINT(' + cast(@longitude as nvarchar) + ' ' + cast(@latitude as nvarchar) + ')';

और अंत में, देखते हैं कि हमारा प्रत्येक कार्यालय कितनी दूर है।

SELECT [Office_Name], 
       cast([Office_Location].STDistance(@g) / 1609.344 as numeric(10, 1)) as 'Distance (in miles)' 
FROM [Offices]
ORDER BY 2 ASC

और इससे हमें वे परिणाम मिलते हैं जिनकी हम उम्मीद कर रहे थे।

जाहिर है, आप TOP(1) . में फिसल सकते हैं यदि आप केवल निकटतम . देखना चाहते हैं कार्यालय।

बढ़िया, हे ?

बस एक रोड़ा है। जब आपके पास बहुत सारे geography हों तुलना करने के लिए अंक, प्रदर्शन शानदार नहीं है, भले ही आप उस डेटाबेस फ़ील्ड पर एक स्थानिक सूचकांक जोड़ते हैं।

मैंने 330,000 geography . की तालिका के विरुद्ध एक बिंदु का परीक्षण किया अंक। यहां दिखाए गए कोड का उपयोग करते हुए, इसे लगभग 8 सेकंड . में निकटतम बिंदु मिल गया .

जब मैंने देशांतर और अक्षांश मानों को संग्रहीत करने के लिए अपनी तालिका को संशोधित किया, और [dbo].[fnCalcDistanceMiles] का उपयोग किया। इस StackOverflow लेख से कार्य करने के बाद, इसे लगभग 3 सेकंड . में निकटतम बिंदु मिल गया ।

हालांकि...

इंटरनेट पर मिले सभी "दो बिंदुओं के बीच की दूरी" के नमूने या तो SQL सर्वर STDistance का उपयोग करते हैं फ़ंक्शन, या गणितीय सूत्र जिसमें (CPU-गहन) cos, sin और tan फ़ंक्शन शामिल हैं।

एक तेज़ समाधान यह था कि समय पर वापस हाई स्कूल की यात्रा की जाए, और याद रखें कि पाइथागोरस ने दो बिंदुओं के बीच की दूरी की गणना कैसे की।

मान लीजिए हम लंदन और पेरिस के बीच की दूरी जानना चाहते हैं।

और यहाँ मेरा SQL सर्वर फ़ंक्शन है:

CREATE FUNCTION [dbo].[uf_CalculateDistance] (@Lat1 decimal(8,4), @Long1 decimal(8,4), @Lat2 decimal(8,4), @Long2 decimal(8,4))
RETURNS decimal (8,4) AS
BEGIN
    DECLARE @d decimal(28,10)

    SET @d = sqrt(square(@[email protected]) + square(@[email protected]))

    RETURN @d
END

अब, याद रखें कि यह फ़ंक्शन मील, किलोमीटर आदि में कोई मान नहीं लौटाता... यह केवल देशांतर और अक्षांश मानों की तुलना कर रहा है। और पाइथागोरस का उपयोग 2डी में किया जाना है, न कि किसी गोल ग्रह पर बिंदुओं की तुलना करने के लिए!

हालांकि, मेरे परीक्षणों में, इसे 1 सेकंड . के भीतर निकटतम बिंदु मिल गया , और SQL सर्वर के STDistance . का उपयोग करने के समान परिणाम दिए समारोह।

तो, सापेक्ष दूरियों . की तुलना करने के लिए इस फ़ंक्शन का उपयोग करने के लिए स्वतंत्र महसूस करें , लेकिन अगर आपको वास्तविक दूरी की आवश्यकता है तो इस फ़ंक्शन का उपयोग न करें।

आशा है कि यह सब मदद करता है।



  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 सर्वर प्रबंधन स्टूडियो में वास्तविक CSV प्रारूप में निर्यात आउटपुट कैसे प्राप्त करें?

  2. SQL सर्वर (T-SQL) में डेटाबेस मेल खाता हटाएं

  3. शीर्ष 5 सुविधाएँ आपके SQL सर्वर डेटाबेस प्रदर्शन निगरानी प्लेटफ़ॉर्म को प्रदान करने की आवश्यकता है

  4. SQL संग्रहीत कार्यविधि में गतिशील SQL परिणाम अस्थायी तालिका में होता है

  5. SQL सर्वर डेटाबेस में सभी तालिकाओं में पहचान कॉलम में प्राथमिक कुंजी बाधा कैसे जोड़ें - SQL सर्वर / TSQL ट्यूटोरियल भाग 63