এসকিউএল সার্ভারে মিডিয়ান গণনা করার কাজ


227

এমএসডিএন অনুসারে , ট্রেনজ্যাক্ট-এসকিউএলে সামগ্রিক ফাংশন হিসাবে মিডিয়ান পাওয়া যায় না। তবে, আমি এই কার্যকারিতাটি তৈরি করা সম্ভব ( এটিগ্রিগ্রেট ক্রিয়েট ফাংশন, ব্যবহারকারীর সংজ্ঞায়িত ফাংশন বা অন্য কোনও পদ্ধতি ব্যবহার করে) তৈরি করা সম্ভব কিনা তা জানতে চাই ।

এটি করার সর্বোত্তম উপায় (যদি সম্ভব হয়) কী হবে - একটি সামগ্রিক ক্যোয়ারিতে একটি মধ্যমানের মান (একটি সংখ্যার ডেটা ধরণ অনুমান করে) গণনার অনুমতি দিন?


উত্তর:


145

2019 আপডেট: আমি এই উত্তরটি লেখার পর থেকে 10 বছরে আরও সমাধান প্রকাশ পেয়েছে যা আরও ভাল ফলাফল পেতে পারে। এছাড়াও, এসকিউএল সার্ভার এর পর থেকে প্রকাশিত হয়েছে (বিশেষত এসকিউএল 2012) নতুন টি-এসকিউএল বৈশিষ্ট্য চালু করেছে যা মিডিয়ানদের গণনা করতে ব্যবহার করা যেতে পারে। এসকিউএল সার্ভারের প্রকাশগুলি তার ক্যোয়ারী অপ্টিমাইজারকেও উন্নত করেছে যা বিভিন্ন মিডিয়ান সমাধানগুলির পারফেক্টকে প্রভাবিত করতে পারে। নেট-নেট, আমার আসল ২০০৯ পোস্টটি এখনও ঠিক আছে তবে আধুনিক এসকিউএল সার্ভার অ্যাপ্লিকেশনগুলির জন্য আরও ভাল সমাধান হতে পারে। 2012 থেকে এই নিবন্ধটি একবার দেখুন যা একটি দুর্দান্ত সংস্থান: https://sqlperformance.com/2012/08/t-sql-queries/median

এই নিবন্ধটি নীচের প্যাটার্নটিকে অন্য সকল বিকল্পের তুলনায় অনেকটা দ্রুত, কমপক্ষে তারা পরীক্ষিত সাধারণ স্কিমায় খুঁজে পেয়েছে। এই দ্রবণটি টেস্ট করা সবচেয়ে ধীর ( PERCENTILE_CONT) সমাধানের চেয়ে 373x দ্রুত (!!!) ছিল । নোট করুন যে এই কৌশলটির জন্য দুটি পৃথক প্রশ্নের প্রয়োজন যা সমস্ত ক্ষেত্রে ব্যবহারিক নাও হতে পারে। এটির জন্য এসকিউএল 2012 বা তার পরেও প্রয়োজন।

DECLARE @c BIGINT = (SELECT COUNT(*) FROM dbo.EvenRows);

SELECT AVG(1.0 * val)
FROM (
    SELECT val FROM dbo.EvenRows
     ORDER BY val
     OFFSET (@c - 1) / 2 ROWS
     FETCH NEXT 1 + (1 - @c % 2) ROWS ONLY
) AS x;

অবশ্যই, কেবলমাত্র 2012 সালে একটি স্কিমাতে একটি পরীক্ষা দুর্দান্ত ফলাফল এনেছে, আপনার মাইলেজটি আলাদা হতে পারে, বিশেষত আপনি যদি এসকিউএল সার্ভার 2014 বা তার পরে থাকেন। পারফ আপনার মধ্যম গণনার জন্য গুরুত্বপূর্ণ হলে, আপনি আপনার স্কিমাটির জন্য সেরাটি খুঁজে পেয়েছেন তা নিশ্চিত করার জন্য আমি নিবন্ধে প্রস্তাবিত বেশ কয়েকটি বিকল্পের জন্য পারফরম্যান্সের চেষ্টা করার চেষ্টা করছি।

আমি (এসকিউএল সার্ভারে নতুন 2012) ফাংশনটি ব্যবহার করে বিশেষত সতর্ক থাকব যা এই প্রশ্নের অন্য উত্তরগুলিরPERCENTILE_CONT মধ্যে একটিতে সুপারিশ করা হয়েছে , কারণ উপরে লিঙ্কিত নিবন্ধটি অন্তর্নির্মিত ফাংশনটি দ্রুততম সমাধানের চেয়ে 373x ধীর বলে মনে করেছে। এটি সম্ভব যে since বছরে এই বৈষম্যটি উন্নত হয়েছে, তবে ব্যক্তিগতভাবে আমি এর কার্যকারিতা বনাম অন্যান্য সমাধানগুলি যাচাই না করা পর্যন্ত আমি এই ফাংশনটি একটি বৃহত টেবিলে ব্যবহার করব না।

মৌলিক 2009 পোস্ট নীচে:

নাটকীয়ভাবে পরিবর্তিত পারফরম্যান্স সহ এটি করার প্রচুর উপায় রয়েছে। এখানে মেডিয়ান, ROW_NUMBERs এবং কর্মক্ষমতা থেকে একটি বিশেষভাবে অনুকূলিত সমাধান রয়েছে । মৃত্যুদন্ড কার্যকর করার সময় উত্পন্ন আই / ওএসের ক্ষেত্রে এটি একটি সর্বোত্তম সমাধান - এটি অন্যান্য সমাধানগুলির চেয়ে বেশি ব্যয়বহুল দেখায় তবে এটি আসলে আরও দ্রুত।

সেই পৃষ্ঠাতে অন্যান্য সমাধান এবং কর্মক্ষমতা পরীক্ষার বিশদ সম্পর্কিত আলোচনা রয়েছে। মিডিয়ান কলামের একই মান সহ একাধিক সারি রয়েছে এমন ক্ষেত্রে ডিসাম্বিগুয়েটর হিসাবে একটি অনন্য কলামের ব্যবহার নোট করুন।

সমস্ত ডাটাবেস কর্মক্ষমতা পরিস্থিতিগুলির মতো, আসল হার্ডওয়্যার সম্পর্কিত ডেটা দিয়ে সর্বদা সমাধানের পরীক্ষা করার চেষ্টা করুন - আপনার পরিবেশে যখন এসকিউএল সার্ভারের অপ্টিমাইজার বা বিশেষত পরিবর্তন ঘটে তখন আপনি কখনই জানেন না যে সাধারণত-দ্রুতগতির সমাধানকে ধীর করে দেয়।

SELECT
   CustomerId,
   AVG(TotalDue)
FROM
(
   SELECT
      CustomerId,
      TotalDue,
      -- SalesOrderId in the ORDER BY is a disambiguator to break ties
      ROW_NUMBER() OVER (
         PARTITION BY CustomerId
         ORDER BY TotalDue ASC, SalesOrderId ASC) AS RowAsc,
      ROW_NUMBER() OVER (
         PARTITION BY CustomerId
         ORDER BY TotalDue DESC, SalesOrderId DESC) AS RowDesc
   FROM Sales.SalesOrderHeader SOH
) x
WHERE
   RowAsc IN (RowDesc, RowDesc - 1, RowDesc + 1)
GROUP BY CustomerId
ORDER BY CustomerId;

12
আপনার ডেটাতে বিশেষত প্রচুর দুগ্ধ থাকলে এটি কাজ করে বলে আমি মনে করি না। আপনি গ্যারান্টি দিতে পারবেন না যে সারিবদ্ধ সংখ্যাটি সীমাবদ্ধ থাকবে। আপনি আপনার মাঝারিটির জন্য কিছু সত্যই ক্রেজি উত্তর পেতে পারেন, বা আরও খারাপ, কোনও মিডিয়ানও নেই।
জোনাথন বিয়ারহালটার

26
এ কারণেই ডিসামিগিগুয়েটার (উপরের কোড উদাহরণে সেলস অর্ডারআইডি) থাকা জরুরী, সুতরাং আপনি নিশ্চিত করতে পারেন যে ফলাফল-সেট সারিগুলির ক্রম পিছনের এবং সামনের দিকে উভয়ই সামঞ্জস্যপূর্ণ। প্রায়শই একটি অনন্য প্রাথমিক কী একটি আদর্শ বিড়ম্বনা তৈরি করে কারণ এটি পৃথক সূচী অনুসন্ধান ব্যতীত উপলব্ধ। যদি কোনও বিশৃঙ্খলা কলাম উপলব্ধ না থাকে (উদাহরণস্বরূপ, যদি টেবিলটির কোনও স্বতন্ত্র কী না থাকে), তবে আর একটি পদ্ধতির মাধ্যম গণনা করতে হবে, কারণ আপনি সঠিকভাবে উল্লেখ করেছেন, আপনি যদি গ্যারান্টি দিতে না পারেন যে DESC সারি সংখ্যাগুলির মিরর চিত্র এএসসি সারি সংখ্যা, তারপরে ফলাফল অনাকাঙ্ক্ষিত।
জাস্টিন গ্রান্ট

4
ধন্যবাদ, আমার ডিবিতে কলামগুলি স্যুইচ করার সময়, এটি প্রাসঙ্গিক নয় বলে ভেবে আমি ডিস্যাম্বিগুয়েটারটি ফেলে দিলাম। সেক্ষেত্রে এই সমাধানটি সত্যই ভাল কাজ করে।
জোনাথন বেরহলটার

8
আমি কোডটি নিজেই একটি মন্তব্য যুক্ত করার পরামর্শ দিই, ডিসামিগিগুয়েটারের প্রয়োজনীয়তা বর্ণনা করে।
হফম্যানক

4
অসাধারণ! আমি এর গুরুত্বটি অনেক আগে থেকেই জানি তবে এখন আমি এটির একটি নাম দিতে পারি ... বিড়ম্বনা! ধন্যবাদ জাস্টিন!
কোডমানকি

204

যদি আপনি এসকিউএল 2005 ব্যবহার করেন বা আরও ভাল এটি কোনও টেবিলের একক কলামের জন্য এটি একটি দুর্দান্ত, সাধারণ-ইশ মধ্যম গণনা:

SELECT
(
 (SELECT MAX(Score) FROM
   (SELECT TOP 50 PERCENT Score FROM Posts ORDER BY Score) AS BottomHalf)
 +
 (SELECT MIN(Score) FROM
   (SELECT TOP 50 PERCENT Score FROM Posts ORDER BY Score DESC) AS TopHalf)
) / 2 AS Median

62
এটি চতুর এবং অপেক্ষাকৃত সহজ যে কোনও মেডিয়ান () সমষ্টিগত কার্য উপস্থিত নেই। তবে এটি কীভাবে কোনও মিডিয়ান () ফাংশন উপস্থিত নেই !? আমি খোলামেলাভাবে কিছুটা ফ্লোর () এড।
চার্লি কিলিয়ান

ভাল, দুর্দান্ত এবং সাধারণ, তবে সাধারণভাবে আপনার নির্দিষ্ট গ্রুপ বিভাগ অনুসারে মিডিয়ান প্রয়োজন, যেমন select gid, median(score) from T group by gid। আপনি কি এর জন্য একটি সংযুক্ত subquery প্রয়োজন?
টিএমএস

1
... আমি এই ক্ষেত্রে যেমন চাইছি (দ্বিতীয় স্বেচ্ছাসেবীর নামটি "সর্বাধিক মধ্যম উত্তর স্কোর সহ ব্যবহারকারী")।
টিএমএস

টমাস - আপনি কি আপনার "প্রতি নির্দিষ্ট গোষ্ঠী বিভাগ" ইস্যু প্লিজটি সমাধান করতে পরিচালনা করেছেন? আমার যেমন সমস্যা আছে তেমন ধন্যবাদ।
স্টু হার্পার

3
গ্রুপের মাধ্যমে এই সমাধানটি কীভাবে ব্যবহার করবেন?
প্রজেমেস্লাও

82

এসকিউএল সার্ভারে 2012 আপনার PERCENTILE_CONT ব্যবহার করা উচিত :

SELECT SalesOrderID, OrderQty,
    PERCENTILE_CONT(0.5) 
        WITHIN GROUP (ORDER BY OrderQty)
        OVER (PARTITION BY SalesOrderID) AS MedianCont
FROM Sales.SalesOrderDetail
WHERE SalesOrderID IN (43670, 43669, 43667, 43663)
ORDER BY SalesOrderID DESC

আরও দেখুন: http://blog.sqlauthority.com/2011/11/20/sql-server-intr پيداوار-to-percentil_cont-analytic-function-introduced-in-sql-server-2012/


12
এই বিশেষজ্ঞ বিশ্লেষণটি খারাপ পারফরম্যান্সের কারণে পার্সেন্টিল ফাংশনগুলির বিরুদ্ধে একটি বাধ্যতামূলক যুক্তি তোলে। sqlperformance.com/2012/08/t-sql-queries/median
carl.anderson

4
আপনি যদি একটি যোগ করতে হবে না DISTINCTবা GROUPY BY SalesOrderID? অন্যথায় আপনার কাছে অনেকগুলি সদৃশ সারি থাকবে।
কনস্টান্টিন

1
এই উত্তর। জানেন না কেন আমাকে এ পর্যন্ত স্ক্রোল করতে হয়েছিল
FistOfFury

এছাড়াও একটি বিচক্ষণ সংস্করণ রয়েছেPERCENTILE_DISC
jannDanger

উপরে @ কার্ল.এন্ডারসনের পয়েন্টকে জোর দেওয়া: একটি নির্দিষ্ট পার্কেনসিএল সমাধানটি তাদের বিশেষ পরীক্ষার স্কিমাতে এসকিউএল সার্ভার ২০১২-তে পরীক্ষা করা দ্রুততম সমাধানের তুলনায় 373x ধীর (!!!!) হিসাবে পরিমাপ করা হয়েছিল। কারেল আরও বিশদ জন্য লিঙ্ক করা নিবন্ধটি পড়ুন।
জাস্টিন গ্রান্ট

21

আমার মূল দ্রুত উত্তরটি ছিল:

select  max(my_column) as [my_column], quartile
from    (select my_column, ntile(4) over (order by my_column) as [quartile]
         from   my_table) i
--where quartile = 2
group by quartile

এটি আপনাকে এক ঝরঝরে করে মাঝারি এবং আন্তঃখণ্ডের পরিসর দেবে। আপনি যদি সত্যিই কেবল একটি সারি চান তবে এটি মধ্যম তবে যেখানে ক্লজটি অস্বীকার করুন।

আপনি যখন এটি একটি ব্যাখ্যা পরিকল্পনার সাথে আটকে রাখেন, তখন 60% কাজ ডেটা বাছাই করে যা অনিবার্য নয় যেমন অবস্থান নির্ভর করে পরিসংখ্যান গণনা করার সময়।

আমি নীচের মন্তব্যে রবার্ট ইভেক-রোবাজের দুর্দান্ত পরামর্শ অনুসরণ করতে উত্তরটি সংশোধন করেছি:

;with PartitionedData as
  (select my_column, ntile(10) over (order by my_column) as [percentile]
   from   my_table),
MinimaAndMaxima as
  (select  min(my_column) as [low], max(my_column) as [high], percentile
   from    PartitionedData
   group by percentile)
select
  case
    when b.percentile = 10 then cast(b.high as decimal(18,2))
    else cast((a.low + b.high)  as decimal(18,2)) / 2
  end as [value], --b.high, a.low,
  b.percentile
from    MinimaAndMaxima a
  join  MinimaAndMaxima b on (a.percentile -1 = b.percentile) or (a.percentile = 10 and b.percentile = 10)
--where b.percentile = 5

আপনার যখন এমনকি সংখ্যক ডেটা আইটেম থাকে তখন এটি সঠিক মিডিয়ান এবং পারসেন্টাইল মানগুলি গণনা করা উচিত। আবার, চূড়ান্তভাবে পরিস্থিতি স্বীকার করুন যেখানে আপনি কেবলমাত্র মধ্যমা চান এবং সম্পূর্ণ শতকরা বিতরণ নয় cla


1
এটি আসলে বেশ ভাল কাজ করে এবং ডেটা বিভাজনের জন্য অনুমতি দেয়।
জোনাথন বেরহল্টার

3
যদি একে একে বন্ধ হয়ে যাওয়া ঠিক হয় তবে উপরের ক্যোয়ারীটি ঠিক আছে। তবে আপনার যদি সঠিক মাধ্যমের প্রয়োজন হয় তবে আপনার সমস্যা হবে। উদাহরণস্বরূপ, ক্রম (1,3,5,7) মধ্যমা 4 কিন্তু ক্যোয়ারী আয় 3. উপরে জন্য (1,2,3,503,603,703) জন্য মধ্যমা 258 কিন্তু আয় 503. উপরে ক্যোয়ারী
জাস্টিন গ্রান্ট

1
আপনি একটি subquery প্রতিটি চতুর্থাংশ সর্বাধিক এবং মিনিট গ্রহণ করে অসম্পূর্ণতা ত্রুটিটি ঠিক করতে পারে, তারপরের পরবর্তী এবং এর MIN এর AVGing?
আরবিজেজ


8

এমএস এসকিউএল সার্ভার ২০১২ (এবং তারপরে) এর PERCENTILE_DISC ফাংশন রয়েছে যা সাজানো মানগুলির জন্য একটি নির্দিষ্ট পারসেন্টাইলকে গণনা করে। PERCENTILE_DISC (0.5) মধ্যমা গণনা করবে - https://msdn.microsoft.com/en-us/library/hh231327.aspx


4

সহজ, দ্রুত, নির্ভুল

SELECT x.Amount 
FROM   (SELECT amount, 
               Count(1) OVER (partition BY 'A')        AS TotalRows, 
               Row_number() OVER (ORDER BY Amount ASC) AS AmountOrder 
        FROM   facttransaction ft) x 
WHERE  x.AmountOrder = Round(x.TotalRows / 2.0, 0)  

4

আপনি যদি এসকিউএল সার্ভারে একটি করে তৈরি করুন ক্রিয়াকলাপটি ব্যবহার করতে চান তবে এটি এটি করা যায়। এইভাবে এটি করার ফলে পরিষ্কার প্রশ্ন লিখতে সক্ষম হওয়ার সুবিধা রয়েছে। নোট করুন এই প্রক্রিয়াটি মোটামুটি সহজেই পার্সেন্টাইল মান গণনা করতে অভিযোজিত হতে পারে।

একটি নতুন ভিজ্যুয়াল স্টুডিও প্রকল্প তৈরি করুন এবং লক্ষ্য ফ্রেমওয়ার্কটি .NET 3.5 এ সেট করুন (এটি এসকিউএল ২০০৮ এর জন্য, এটি এসকিউএল ২০১২-এ আলাদা হতে পারে)। তারপরে একটি শ্রেণিবদ্ধ ফাইল তৈরি করুন এবং নীচের কোডে রাখুন, বা সি # সমতুল্য:

Imports Microsoft.SqlServer.Server
Imports System.Data.SqlTypes
Imports System.IO

<Serializable>
<SqlUserDefinedAggregate(Format.UserDefined, IsInvariantToNulls:=True, IsInvariantToDuplicates:=False, _
  IsInvariantToOrder:=True, MaxByteSize:=-1, IsNullIfEmpty:=True)>
Public Class Median
  Implements IBinarySerialize
  Private _items As List(Of Decimal)

  Public Sub Init()
    _items = New List(Of Decimal)()
  End Sub

  Public Sub Accumulate(value As SqlDecimal)
    If Not value.IsNull Then
      _items.Add(value.Value)
    End If
  End Sub

  Public Sub Merge(other As Median)
    If other._items IsNot Nothing Then
      _items.AddRange(other._items)
    End If
  End Sub

  Public Function Terminate() As SqlDecimal
    If _items.Count <> 0 Then
      Dim result As Decimal
      _items = _items.OrderBy(Function(i) i).ToList()
      If _items.Count Mod 2 = 0 Then
        result = ((_items((_items.Count / 2) - 1)) + (_items(_items.Count / 2))) / 2@
      Else
        result = _items((_items.Count - 1) / 2)
      End If

      Return New SqlDecimal(result)
    Else
      Return New SqlDecimal()
    End If
  End Function

  Public Sub Read(r As BinaryReader) Implements IBinarySerialize.Read
    'deserialize it from a string
    Dim list = r.ReadString()
    _items = New List(Of Decimal)

    For Each value In list.Split(","c)
      Dim number As Decimal
      If Decimal.TryParse(value, number) Then
        _items.Add(number)
      End If
    Next

  End Sub

  Public Sub Write(w As BinaryWriter) Implements IBinarySerialize.Write
    'serialize the list to a string
    Dim list = ""

    For Each item In _items
      If list <> "" Then
        list += ","
      End If      
      list += item.ToString()
    Next
    w.Write(list)
  End Sub
End Class

তারপরে এটি সংকলন করুন এবং আপনার এসকিউএল সার্ভার মেশিনে ডিএলএল এবং পিডিবি ফাইলটি অনুলিপি করুন এবং এসকিউএল সার্ভারে নিম্নলিখিত কমান্ডটি চালান:

CREATE ASSEMBLY CustomAggregate FROM '{path to your DLL}'
WITH PERMISSION_SET=SAFE;
GO

CREATE AGGREGATE Median(@value decimal(9, 3))
RETURNS decimal(9, 3) 
EXTERNAL NAME [CustomAggregate].[{namespace of your DLL}.Median];
GO

তারপরে আপনি মিডিয়ার গণনা করার জন্য একটি কোয়েরি লিখতে পারেন: dbo.Median (ক্ষেত্র) FROM সারণী থেকে নির্বাচন করুন


3

মিডিয়ানের একটি সেট ভিত্তিক সমাধান সন্ধান করতে গিয়ে আমি এই পৃষ্ঠাটি জুড়ে এসেছি। এখানে কয়েকটি সমাধান দেখার পরে আমি নিম্নলিখিতগুলি নিয়ে এসেছি। আশা সাহায্য / কাজ করে।

DECLARE @test TABLE(
    i int identity(1,1),
    id int,
    score float
)

INSERT INTO @test (id,score) VALUES (1,10)
INSERT INTO @test (id,score) VALUES (1,11)
INSERT INTO @test (id,score) VALUES (1,15)
INSERT INTO @test (id,score) VALUES (1,19)
INSERT INTO @test (id,score) VALUES (1,20)

INSERT INTO @test (id,score) VALUES (2,20)
INSERT INTO @test (id,score) VALUES (2,21)
INSERT INTO @test (id,score) VALUES (2,25)
INSERT INTO @test (id,score) VALUES (2,29)
INSERT INTO @test (id,score) VALUES (2,30)

INSERT INTO @test (id,score) VALUES (3,20)
INSERT INTO @test (id,score) VALUES (3,21)
INSERT INTO @test (id,score) VALUES (3,25)
INSERT INTO @test (id,score) VALUES (3,29)

DECLARE @counts TABLE(
    id int,
    cnt int
)

INSERT INTO @counts (
    id,
    cnt
)
SELECT
    id,
    COUNT(*)
FROM
    @test
GROUP BY
    id

SELECT
    drv.id,
    drv.start,
    AVG(t.score)
FROM
    (
        SELECT
            MIN(t.i)-1 AS start,
            t.id
        FROM
            @test t
        GROUP BY
            t.id
    ) drv
    INNER JOIN @test t ON drv.id = t.id
    INNER JOIN @counts c ON t.id = c.id
WHERE
    t.i = ((c.cnt+1)/2)+drv.start
    OR (
        t.i = (((c.cnt+1)%2) * ((c.cnt+2)/2))+drv.start
        AND ((c.cnt+1)%2) * ((c.cnt+2)/2) <> 0
    )
GROUP BY
    drv.id,
    drv.start

3

নীচের ক্যোয়ারীটি একটি কলামে মানগুলির তালিকা থেকে মধ্যমাটিকে ফিরিয়ে দেয় । এটি সামগ্রিক ফাংশন হিসাবে বা পাশাপাশি ব্যবহার করা যায় না, তবে আপনি এখনও এটি অভ্যন্তরীণ নির্বাচনের যেখানে একটি বিধি সহ একটি সাব-কোয়েরি হিসাবে ব্যবহার করতে পারেন।

এসকিউএল সার্ভার 2005+:

SELECT TOP 1 value from
(
    SELECT TOP 50 PERCENT value 
    FROM table_name 
    ORDER BY  value
)for_median
ORDER BY value DESC

3

যদিও জাস্টিন গ্রান্টের সমাধানটি দৃ appears় দেখা যাচ্ছে আমি পেয়েছি যে আপনি যখন একটি প্রদত্ত পার্টিশন কী এর মধ্যে অনেকগুলি সদৃশ মান রেখেছেন তখন ASC সদৃশ মানগুলির জন্য সারি সংখ্যাগুলি ক্রমবিন্যাসের বাইরে চলে যায় যাতে তারা সঠিকভাবে প্রান্তিক না হয়।

এখানে আমার ফলাফল থেকে একটি টুকরা রয়েছে:

KEY VALUE ROWA ROWD  

13  2     22   182
13  1     6    183
13  1     7    184
13  1     8    185
13  1     9    186
13  1     10   187
13  1     11   188
13  1     12   189
13  0     1    190
13  0     2    191
13  0     3    192
13  0     4    193
13  0     5    194

আমি এই সমাধানের ভিত্তি হিসাবে জাস্টিনের কোড ব্যবহার করেছি। যদিও একাধিক উত্সযুক্ত টেবিলগুলি ব্যবহারের ক্ষেত্রে দক্ষ না হলেও এটি আমার সারি ক্রম ক্রম সমস্যাটি সমাধান করে। যে কোনও উন্নতি স্বাগত হবে কারণ আমি টি-এসকিউএল-তে অভিজ্ঞ নই।

SELECT PKEY, cast(AVG(VALUE)as decimal(5,2)) as MEDIANVALUE
FROM
(
  SELECT PKEY,VALUE,ROWA,ROWD,
  'FLAG' = (CASE WHEN ROWA IN (ROWD,ROWD-1,ROWD+1) THEN 1 ELSE 0 END)
  FROM
  (
    SELECT
    PKEY,
    cast(VALUE as decimal(5,2)) as VALUE,
    ROWA,
    ROW_NUMBER() OVER (PARTITION BY PKEY ORDER BY ROWA DESC) as ROWD 

    FROM
    (
      SELECT
      PKEY, 
      VALUE,
      ROW_NUMBER() OVER (PARTITION BY PKEY ORDER BY VALUE ASC,PKEY ASC ) as ROWA 
      FROM [MTEST]
    )T1
  )T2
)T3
WHERE FLAG = '1'
GROUP BY PKEY
ORDER BY PKEY

2

উপরের জাস্টিনের উদাহরণটি খুব ভাল। তবে সেই প্রাথমিক কীটি খুব পরিষ্কারভাবে বলা উচিত। আমি কোডটি বুনোতে কী ছাড়াই দেখেছি এবং ফলাফলগুলি খারাপ।

পারসেন্টাইল_কন্ট সম্পর্কে আমি যে অভিযোগ পেয়েছি তা হ'ল এটি আপনাকে ডেটাসেট থেকে একটি আসল মান দেবে না। একটি "মিডিয়ান" পেতে যা ডেটাসেট থেকে আসল মান পার্সেন্টাইল_ডিস্ক ব্যবহার করুন।

SELECT SalesOrderID, OrderQty,
    PERCENTILE_DISC(0.5) 
        WITHIN GROUP (ORDER BY OrderQty)
        OVER (PARTITION BY SalesOrderID) AS MedianCont
FROM Sales.SalesOrderDetail
WHERE SalesOrderID IN (43670, 43669, 43667, 43663)
ORDER BY SalesOrderID DESC

2

কোনও ইউডিএফ-তে লিখুন:

 Select Top 1 medianSortColumn from Table T
  Where (Select Count(*) from Table
         Where MedianSortColumn <
           (Select Count(*) From Table) / 2)
  Order By medianSortColumn

7
এমনকি সংখ্যক আইটেমের ক্ষেত্রে, মধ্যমাটি দুটি মাঝারি আইটেমের গড়, যা এই ইউডিএফ দ্বারা আচ্ছাদন করা হয় না।
ইয়াকভ এলিস

1
আপনি কি পুরো ইউডিএফ এ আবার লিখতে পারবেন?
প্রেজেমস্লাও

2

মিডিয়ান ফাইন্ডিং

এটি কোনও বৈশিষ্ট্যের মধ্যস্থতা খুঁজে পাওয়ার সহজতম পদ্ধতি।

Select round(S.salary,4) median from employee S where (select count(salary) from station where salary < S.salary ) = (select count(salary) from station where salary > S.salary)

সারি সংখ্যা সমান হলে কীভাবে মামলা পরিচালিত হবে?
priojit priyom


1

'টেবিল 1' থেকে ধারাবাহিক পরিবর্তনশীল / পরিমাপ 'কল 1' জন্য

select col1  
from
    (select top 50 percent col1, 
    ROW_NUMBER() OVER(ORDER BY col1 ASC) AS Rowa,
    ROW_NUMBER() OVER(ORDER BY col1 DESC) AS Rowd
    from table1 ) tmp
where tmp.Rowa = tmp.Rowd

1

COUNT সমষ্টি ব্যবহার করে, আপনি প্রথমে @ cnt নামক একটি ভেরিয়েবলে কয়টি সারি রয়েছে এবং তা সঞ্চয় করতে পারেন। তারপরে আপনি কিউটি অর্ডারের উপর ভিত্তি করে, কতগুলি সারি বাদ দিতে হবে (অফসেট মান) এবং কতগুলি ফিল্টার করতে হবে (মান আনতে হবে) তার উপর ভিত্তি করে অফসেট-ফেচ ফিল্টারের জন্য প্যারামিটারগুলি গণনা করতে পারেন।

এড়িয়ে যাওয়ার জন্য সারিগুলির সংখ্যা (@ সিএনটি - 1) / 2. হ'ল এটি স্পষ্ট যে অদ্ভুত গণনার জন্য এই গণনাটি সঠিক কারণ আপনি 2 দ্বারা বিভক্ত হওয়ার আগে আপনি প্রথম একক মধ্যম মানের জন্য 1 বিয়োগ করেন।

এটি এমনকি একটি সংখ্যার জন্যও সঠিকভাবে কাজ করে কারণ অভিব্যক্তিতে ব্যবহৃত বিভাগটি পূর্ণসংখ্যা বিভাগ; সুতরাং, সমান গণনা থেকে 1 বিয়োগ করার সময়, আপনি একটি বিজোড় মান রেখে চলেছেন।

এই বিজোড় মানটিকে 2 দ্বারা ভাগ করার সময়, ফলাফল (.5) এর ভগ্নাংশটি কেটে ফেলা হয়। আনার জন্য সারির সংখ্যা 2 - (@ সিএনটি% 2)। ধারণাটি হ'ল যখন গণনাটি বিজোড় হয় তখন মডিউল অপারেশনের ফলাফল 1 হয় এবং আপনাকে 1 সারি আনতে হবে। যখন গণনাটি এমনকি মডিউল অপারেশনের ফলাফল 0 হয় এবং আপনাকে 2 টি সারি আনতে হবে। 2 থেকে মডিউল অপারেশনের 1 বা 0 ফলাফল বিয়োগ করে আপনি যথাক্রমে পছন্দসই 1 বা 2 পান get অবশেষে, মধ্যমা পরিমাণ গণনা করতে, এক বা দুটি ফলাফলের পরিমাণ গ্রহণ করুন এবং ইনপুট পূর্ণসংখ্যা মানটিকে একটি সংখ্যার সাথে রূপান্তর করার পরে গড় প্রয়োগ করুন:

DECLARE @cnt AS INT = (SELECT COUNT(*) FROM [Sales].[production].[stocks]);
SELECT AVG(1.0 * quantity) AS median
FROM ( SELECT quantity
FROM [Sales].[production].[stocks]
ORDER BY quantity
OFFSET (@cnt - 1) / 2 ROWS FETCH NEXT 2 - @cnt % 2 ROWS ONLY ) AS D;

0

আমি নিজেই একটি সমাধান বের করতে চেয়েছিলাম, তবে আমার মস্তিষ্ক ছড়িয়ে পড়ে এবং পথে পড়ে গেল। আমি মনে করি এটি কার্যকর হয় তবে সকালে আমাকে এটি ব্যাখ্যা করতে বলবেন না। : P: P

DECLARE @table AS TABLE
(
    Number int not null
);

insert into @table select 2;
insert into @table select 4;
insert into @table select 9;
insert into @table select 15;
insert into @table select 22;
insert into @table select 26;
insert into @table select 37;
insert into @table select 49;

DECLARE @Count AS INT
SELECT @Count = COUNT(*) FROM @table;

WITH MyResults(RowNo, Number) AS
(
    SELECT RowNo, Number FROM
        (SELECT ROW_NUMBER() OVER (ORDER BY Number) AS RowNo, Number FROM @table) AS Foo
)
SELECT AVG(Number) FROM MyResults WHERE RowNo = (@Count+1)/2 OR RowNo = ((@Count+1)%2) * ((@Count+2)/2)

0
--Create Temp Table to Store Results in
DECLARE @results AS TABLE 
(
    [Month] datetime not null
 ,[Median] int not null
);

--This variable will determine the date
DECLARE @IntDate as int 
set @IntDate = -13


WHILE (@IntDate < 0) 
BEGIN

--Create Temp Table
DECLARE @table AS TABLE 
(
    [Rank] int not null
 ,[Days Open] int not null
);

--Insert records into Temp Table
insert into @table 

SELECT 
    rank() OVER (ORDER BY DATEADD(mm, DATEDIFF(mm, 0, DATEADD(ss, SVR.close_date, '1970')), 0), DATEDIFF(day,DATEADD(ss, SVR.open_date, '1970'),DATEADD(ss, SVR.close_date, '1970')),[SVR].[ref_num]) as [Rank]
 ,DATEDIFF(day,DATEADD(ss, SVR.open_date, '1970'),DATEADD(ss, SVR.close_date, '1970')) as [Days Open]
FROM
 mdbrpt.dbo.View_Request SVR
 LEFT OUTER JOIN dbo.dtv_apps_systems vapp 
 on SVR.category = vapp.persid
 LEFT OUTER JOIN dbo.prob_ctg pctg 
 on SVR.category = pctg.persid
 Left Outer Join [mdbrpt].[dbo].[rootcause] as [Root Cause] 
 on [SVR].[rootcause]=[Root Cause].[id]
 Left Outer Join [mdbrpt].[dbo].[cr_stat] as [Status]
 on [SVR].[status]=[Status].[code]
 LEFT OUTER JOIN [mdbrpt].[dbo].[net_res] as [net] 
 on [net].[id]=SVR.[affected_rc]
WHERE
 SVR.Type IN ('P') 
 AND
 SVR.close_date IS NOT NULL 
 AND
 [Status].[SYM] = 'Closed'
 AND
 SVR.parent is null
 AND
 [Root Cause].[sym] in ( 'RC - Application','RC - Hardware', 'RC - Operational', 'RC - Unknown')
 AND
 (
  [vapp].[appl_name] in ('3PI','Billing Rpts/Files','Collabrent','Reports','STMS','STMS 2','Telco','Comergent','OOM','C3-BAU','C3-DD','DIRECTV','DIRECTV Sales','DIRECTV Self Care','Dealer Website','EI Servlet','Enterprise Integration','ET','ICAN','ODS','SB-SCM','SeeBeyond','Digital Dashboard','IVR','OMS','Order Services','Retail Services','OSCAR','SAP','CTI','RIO','RIO Call Center','RIO Field Services','FSS-RIO3','TAOS','TCS')
 OR
  pctg.sym in ('Systems.Release Health Dashboard.Problem','DTV QA Test.Enterprise Release.Deferred Defect Log')
 AND  
  [Net].[nr_desc] in ('3PI','Billing Rpts/Files','Collabrent','Reports','STMS','STMS 2','Telco','Comergent','OOM','C3-BAU','C3-DD','DIRECTV','DIRECTV Sales','DIRECTV Self Care','Dealer Website','EI Servlet','Enterprise Integration','ET','ICAN','ODS','SB-SCM','SeeBeyond','Digital Dashboard','IVR','OMS','Order Services','Retail Services','OSCAR','SAP','CTI','RIO','RIO Call Center','RIO Field Services','FSS-RIO3','TAOS','TCS')
 )
 AND
 DATEADD(mm, DATEDIFF(mm, 0, DATEADD(ss, SVR.close_date, '1970')), 0) = DATEADD(mm, DATEDIFF(mm,0,DATEADD(mm,@IntDate,getdate())), 0)
ORDER BY [Days Open]



DECLARE @Count AS INT
SELECT @Count = COUNT(*) FROM @table;

WITH MyResults(RowNo, [Days Open]) AS
(
    SELECT RowNo, [Days Open] FROM
        (SELECT ROW_NUMBER() OVER (ORDER BY [Days Open]) AS RowNo, [Days Open] FROM @table) AS Foo
)


insert into @results
SELECT 
 DATEADD(mm, DATEDIFF(mm,0,DATEADD(mm,@IntDate,getdate())), 0) as [Month]
 ,AVG([Days Open])as [Median] FROM MyResults WHERE RowNo = (@Count+1)/2 OR RowNo = ((@Count+1)%2) * ((@Count+2)/2) 


set @IntDate = @IntDate+1
DELETE FROM @table
END

select *
from @results
order by [Month]

0

এটি এসকিউএল 2000 এর সাথে কাজ করে:

DECLARE @testTable TABLE 
( 
    VALUE   INT
)
--INSERT INTO @testTable -- Even Test
--SELECT 3 UNION ALL
--SELECT 5 UNION ALL
--SELECT 7 UNION ALL
--SELECT 12 UNION ALL
--SELECT 13 UNION ALL
--SELECT 14 UNION ALL
--SELECT 21 UNION ALL
--SELECT 23 UNION ALL
--SELECT 23 UNION ALL
--SELECT 23 UNION ALL
--SELECT 23 UNION ALL
--SELECT 29 UNION ALL
--SELECT 40 UNION ALL
--SELECT 56

--
--INSERT INTO @testTable -- Odd Test
--SELECT 3 UNION ALL
--SELECT 5 UNION ALL
--SELECT 7 UNION ALL
--SELECT 12 UNION ALL
--SELECT 13 UNION ALL
--SELECT 14 UNION ALL
--SELECT 21 UNION ALL
--SELECT 23 UNION ALL
--SELECT 23 UNION ALL
--SELECT 23 UNION ALL
--SELECT 23 UNION ALL
--SELECT 29 UNION ALL
--SELECT 39 UNION ALL
--SELECT 40 UNION ALL
--SELECT 56


DECLARE @RowAsc TABLE
(
    ID      INT IDENTITY,
    Amount  INT
)

INSERT INTO @RowAsc
SELECT  VALUE 
FROM    @testTable 
ORDER BY VALUE ASC

SELECT  AVG(amount)
FROM @RowAsc ra
WHERE ra.id IN
(
    SELECT  ID 
    FROM    @RowAsc
    WHERE   ra.id -
    (
        SELECT  MAX(id) / 2.0 
        FROM    @RowAsc
    ) BETWEEN 0 AND 1

)

0

আমার মতো নবজাতকদের যারা খুব বেসিকগুলি শিখছেন তাদের ক্ষেত্রে আমি ব্যক্তিগতভাবে এই উদাহরণটি অনুসরণ করা আরও সহজ মনে করি কারণ ঠিক কী ঘটছে এবং কোথা থেকে মধ্যমানের মানগুলি আসছে তা বোঝা সহজ easier

select
 ( max(a.[Value1]) + min(a.[Value1]) ) / 2 as [Median Value1]
,( max(a.[Value2]) + min(a.[Value2]) ) / 2 as [Median Value2]

from (select
    datediff(dd,startdate,enddate) as [Value1]
    ,xxxxxxxxxxxxxx as [Value2]
     from dbo.table1
     )a

উপরের কিছু কোডের পরম বিস্ময়ে যদিও !!!


0

এটি যতটা সহজ উত্তর ততই আমি সামনে আসতে পেরেছিলাম। আমার ডেটা দিয়ে ভাল কাজ করেছেন। আপনি যদি কিছু মান বাদ দিতে চান তবে কেবলমাত্র অভ্যন্তরীণ নির্বাচনের ক্ষেত্রে একটি ধারা যুক্ত করুন।

SELECT TOP 1 
    ValueField AS MedianValue
FROM
    (SELECT TOP(SELECT COUNT(1)/2 FROM tTABLE)
        ValueField
    FROM 
        tTABLE
    ORDER BY 
        ValueField) A
ORDER BY
    ValueField DESC

0

নিম্নলিখিত সমাধানগুলি এই অনুমানগুলির অধীনে কাজ করে:

  • কোনও সদৃশ মান নেই
  • NULL নেই

কোড:

IF OBJECT_ID('dbo.R', 'U') IS NOT NULL
  DROP TABLE dbo.R

CREATE TABLE R (
    A FLOAT NOT NULL);

INSERT INTO R VALUES (1);
INSERT INTO R VALUES (2);
INSERT INTO R VALUES (3);
INSERT INTO R VALUES (4);
INSERT INTO R VALUES (5);
INSERT INTO R VALUES (6);

-- Returns Median(R)
select SUM(A) / CAST(COUNT(A) AS FLOAT)
from R R1 
where ((select count(A) from R R2 where R1.A > R2.A) = 
      (select count(A) from R R2 where R1.A < R2.A)) OR
      ((select count(A) from R R2 where R1.A > R2.A) + 1 = 
      (select count(A) from R R2 where R1.A < R2.A)) OR
      ((select count(A) from R R2 where R1.A > R2.A) = 
      (select count(A) from R R2 where R1.A < R2.A) + 1) ; 

0
DECLARE @Obs int
DECLARE @RowAsc table
(
ID      INT IDENTITY,
Observation  FLOAT
)
INSERT INTO @RowAsc
SELECT Observations FROM MyTable
ORDER BY 1 
SELECT @Obs=COUNT(*)/2 FROM @RowAsc
SELECT Observation AS Median FROM @RowAsc WHERE ID=@Obs

0

আমি বেশ কয়েকটি বিকল্প দিয়ে চেষ্টা করে দেখি, তবে আমার ডেটা রেকর্ডগুলি বারবারের মানগুলির কারণে, ROW_NUMBER সংস্করণগুলি আমার পক্ষে পছন্দ নয় বলে মনে হচ্ছে। সুতরাং এখানে আমার ব্যবহৃত ক্যোয়ারী (এনটিআইএল সহ একটি সংস্করণ):

SELECT distinct
   CustomerId,
   (
       MAX(CASE WHEN Percent50_Asc=1 THEN TotalDue END) OVER (PARTITION BY CustomerId)  +
       MIN(CASE WHEN Percent50_desc=1 THEN TotalDue END) OVER (PARTITION BY CustomerId) 
   )/2 MEDIAN
FROM
(
   SELECT
      CustomerId,
      TotalDue,
     NTILE(2) OVER (
         PARTITION BY CustomerId
         ORDER BY TotalDue ASC) AS Percent50_Asc,
     NTILE(2) OVER (
         PARTITION BY CustomerId
         ORDER BY TotalDue DESC) AS Percent50_desc
   FROM Sales.SalesOrderHeader SOH
) x
ORDER BY CustomerId;

0

এখানে জেফ আতউডের উত্তর উপর ভিত্তি করে প্রতিটি গ্রুপের মধ্যস্থতা অর্জনের জন্য এটি গ্রুপ এবং একটি সহযোগিত সাব-কোয়ের সাথে রয়েছে।

SELECT TestID, 
(
 (SELECT MAX(Score) FROM
   (SELECT TOP 50 PERCENT Score FROM Posts WHERE TestID = Posts_parent.TestID ORDER BY Score) AS BottomHalf)
 +
 (SELECT MIN(Score) FROM
   (SELECT TOP 50 PERCENT Score FROM Posts WHERE TestID = Posts_parent.TestID ORDER BY Score DESC) AS TopHalf)
) / 2 AS MedianScore,
AVG(Score) AS AvgScore, MIN(Score) AS MinScore, MAX(Score) AS MaxScore
FROM Posts_parent
GROUP BY Posts_parent.TestID

0

প্রায়শই, আমাদের কেবল পুরো টেবিলের জন্য নয়, কিছু আইডি সম্পর্কিত সম্মিলনের জন্য মিডিয়ান গণনা করতে হতে পারে need অন্য কথায়, আমাদের টেবিলের প্রতিটি আইডির জন্য মিডিয়ান গণনা করুন, যেখানে প্রতিটি আইডির অনেক রেকর্ড রয়েছে। (@gdoron দ্বারা সম্পাদিত সমাধানের ভিত্তিতে: ভাল পারফরম্যান্স এবং অনেক এসকিউএল তে কাজ করে)

SELECT our_id, AVG(1.0 * our_val) as Median
FROM
( SELECT our_id, our_val, 
  COUNT(*) OVER (PARTITION BY our_id) AS cnt,
  ROW_NUMBER() OVER (PARTITION BY our_id ORDER BY our_val) AS rnk
  FROM our_table
) AS x
WHERE rnk IN ((cnt + 1)/2, (cnt + 2)/2) GROUP BY our_id;

আশা করি এটা সাহায্য করবে.


0

আপনার প্রশ্নের জন্য, জেফ আতউড ইতিমধ্যে সহজ এবং কার্যকর সমাধান দিয়েছিলেন। তবে, আপনি যদি মিডিয়েন গণনা করার জন্য কিছু বিকল্প পদ্ধতির সন্ধান করছেন তবে এসকিউএল কোডের নীচে আপনাকে সহায়তা করবে।

create table employees(salary int);

insert into employees values(8); insert into employees values(23); insert into employees values(45); insert into employees values(123); insert into employees values(93); insert into employees values(2342); insert into employees values(2238);

select * from employees;

declare @odd_even int; declare @cnt int; declare @middle_no int;


set @cnt=(select count(*) from employees); set @middle_no=(@cnt/2)+1; select @odd_even=case when (@cnt%2=0) THEN -1 ELse 0 END ;


 select AVG(tbl.salary) from  (select  salary,ROW_NUMBER() over (order by salary) as rno from employees group by salary) tbl  where tbl.rno=@middle_no or tbl.rno=@middle_no+@odd_even;

আপনি যদি মাইএসকিউএলে মিডিয়েন গণনা করতে দেখেন তবে এই গিথব লিঙ্কটি কার্যকর হবে।


0

মিডিয়ানদের সন্ধানের জন্য এটি সর্বাধিক অনুকূল সমাধান যা আমি ভাবতে পারি। উদাহরণে নামগুলি জাস্টিন উদাহরণের উপর ভিত্তি করে। সারণী বিক্রয়ের জন্য একটি সূচী নিশ্চিত করুন a ক্রমানুসারে ক্রেডিট আইডি এবং টোটাল ডিউয়ের সাথে ক্রেডিট অর্ডারহাইডার বিদ্যমান রয়েছে order

SELECT
 sohCount.CustomerId,
 AVG(sohMid.TotalDue) as TotalDueMedian
FROM 
(SELECT 
  soh.CustomerId,
  COUNT(*) as NumberOfRows
FROM 
  Sales.SalesOrderHeader soh 
GROUP BY soh.CustomerId) As sohCount
CROSS APPLY 
    (Select 
       soh.TotalDue
    FROM 
    Sales.SalesOrderHeader soh 
    WHERE soh.CustomerId = sohCount.CustomerId 
    ORDER BY soh.TotalDue
    OFFSET sohCount.NumberOfRows / 2 - ((sohCount.NumberOfRows + 1) % 2) ROWS 
    FETCH NEXT 1 + ((sohCount.NumberOfRows + 1) % 2) ROWS ONLY
    ) As sohMid
GROUP BY sohCount.CustomerId

হালনাগাদ

কোন পদ্ধতিতে সর্বোত্তম পারফরম্যান্স রয়েছে তা সম্পর্কে আমি কিছুটা অনিশ্চিত ছিলাম, তাই আমি আমার ব্যাচের তিনটি পদ্ধতির উপর ভিত্তি করে কোয়েরি চালিয়ে আমার পদ্ধতি জাস্টিন গ্রান্টস এবং জেফ অ্যাটউডসের মধ্যে একটি তুলনা করেছি এবং প্রতিটি ক্যোয়ারীর ব্যাচ ব্যয়টি ছিল:

সূচক ছাড়া:

  • খনি 30%
  • জাস্টিন অনুদান 13%
  • জেফ অ্যাটউডস 58%

এবং সূচক সহ

  • খনি 3%।
  • জাস্টিন 10% অনুদান
  • জেফ অ্যাটউডস 87%

আমি দেখতে চেষ্টা করেছি যে ক্যোয়ারীগুলি কতটা স্কেল হয়েছে যদি আপনি প্রায় 12000 সারি থেকে 2125 ফ্যাক্টর দ্বারা আরও বেশি ডেটা তৈরি করে 512 অবধি যার অর্থ শেষ পর্যন্ত প্রায় 7,2 মিলিয়ন সারি তৈরি করে তত সূচক থাকে। নোট আমি কাস্টোমআইড ফিল্ডটি নিশ্চিত করেছিলাম যেখানে প্রতিবারের জন্য আমি একক অনুলিপি অনন্য, তাই গ্রাহকআইডির অনন্য উদাহরণের তুলনায় সারিগুলির অনুপাত স্থির রাখা হয়েছিল। এটি করার সময় আমি মৃত্যুদন্ড কার্যকর করেছিলাম যেখানে আমি পরে সূচিটি পুনরায় তৈরি করেছিলাম এবং আমি লক্ষ্য করেছি যে এই মানগুলির সাথে আমার যে ডেটা ছিল সেগুলি দিয়ে ফলাফলগুলি 128 এর একটি ফ্যাক্টরের কাছাকাছি স্থিতিশীল হয়েছিল:

  • খনি 3%।
  • জাস্টিন 5% অনুদান
  • জেফ অ্যাটউডস 92%

আমি ভাবলাম কীভাবে পারফরম্যান্সের ফলে সংখ্যার সারি স্কেলিং করে কিন্তু অনন্য গ্রাহকআইডকে অবিচ্ছিন্ন রেখে প্রভাব ফেলতে পারে, তাই আমি একটি নতুন পরীক্ষা সেটআপ করেছি যেখানে আমি ঠিক এটি করেছি। এখন স্থিতিশীল হওয়ার পরিবর্তে ব্যাচের দামের অনুপাতটি ডাইভারিং করে রেখেছিল, প্রতি গ্রাহকআইডে প্রায় 20 টি সারি পরিবর্তে আমার কাছে এই জাতীয় অনন্য আইডি প্রতি 10000 সারি প্রায় ছিল। সংখ্যা যেখানে:

  • খনি 4%
  • জাস্টিনস 60%
  • জেফস 35%

আমি ফলাফলের সাথে তুলনা করে প্রতিটি পদ্ধতি সঠিকভাবে প্রয়োগ করেছি তা নিশ্চিত করেছিলাম। আমার উপসংহারটি হল যে পদ্ধতিটি আমি ব্যবহার করি ততক্ষণ ততক্ষণ ততক্ষণ তত সূচক বিদ্যমান থাকে। এছাড়াও লক্ষ্য করা গেছে যে এই নিবন্ধটি এই নিবন্ধটিতে এই বিশেষ সমস্যার জন্য কী প্রস্তাবিত তা হ'ল https://www.microsoftpressstore.com/articles/article.aspx?p=2314819&seqNum=5

এই কোয়েরিতে পরবর্তী কলগুলির কার্যকারিতা আরও উন্নত করার একটি উপায় হ'ল সহায়ক টেবিলে গণনা সম্পর্কিত তথ্য অব্যাহত রাখা। এমনকি আপনি এটির ট্রিগার রেখেও এটি বজায় রাখতে পারেন যা কাস্টমারআইডের উপর নির্ভরশীল সেলসঅর্ডারহাইডার সারিগুলির গণনা সম্পর্কিত তথ্য ধারণ করে এবং অবশ্যই আপনি মিডিয়াকে সাধারণ স্টোরও করতে পারেন।


0

বড় আকারের ডেটাসেটের জন্য, আপনি এই জিআইএসটি চেষ্টা করতে পারেন:

https://gist.github.com/chrisknoll/1b38761ce8c5016ec5b2

এটি আপনার সেটে যে স্বতন্ত্র মানগুলি খুঁজে পাবেন (যেমন বয়স, বা জন্মের বছর, ইত্যাদি) একত্রিত করে কাজ করে এবং কোয়েরিতে আপনি নির্দিষ্ট করেছেন এমন কোনও পারসেন্টাইল অবস্থান সনাক্ত করতে এসকিউএল উইন্ডো ফাংশন ব্যবহার করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.