ریکارڈ یونٹ سے صرف پہلا نکالیں جہاں مخصوص کالم کی قیمت نقل کی گئی ہے۔

جب صفحے کی تازہ کاری :
صفحہ تخلیق تاریخ :

عام طور پر، جب صرف ایک نقلی ریکارڈ نکالتے ہیں، تو پہلی چیز جو ذہن میں آتی ہے وہ یہ ہے distinct کہ میرے خیال میں، distinct آپ کو نقلی کالم اور دوسرے کالم کی وضاحت کرنے کی اجازت نہیں دیتا ہے جسے آپ ایک ہی وقت میں بازیافت کرنا چاہتے ہیں۔ اس کے علاوہ ،distinct اس ضرورت سے میل نہیں کھاتا ہے کیونکہ اس میں نکالنے میں غیر نقلی ریکارڈ شامل ہیں۔

مجھے نہیں لگتا کہ آپ یہ سمجھ سکتے ہیں کہ آپ اکیلے عنوان کے ساتھ کیا کرنا چاہتے ہیں ، لہذا آئیے مثال کے طور پر نمونہ ریکارڈ استعمال کریں۔ میں جو کرنا چاہتا ہوں وہ مندرجہ ذیل نکالنے کا نتیجہ ہے۔

ID کا نام
1 نام 1
2 نام 2
3 نام 3
3 نام 3@example.com
4 نام 4 نام 4@example.com
4 نام 4@example.com
4 نام 4@example.com

اسے مندرجہ ذیل کے طور پر حاصل کریں:

ID کا نام
3 نام 3@example.com
4 نام 4@example.com

آئی ڈی 1 اور 2 شامل نہیں ہیں کیونکہ وہ نقل نہیں ہیں. آئی ڈی 3 اور 4 نقل ہیں ، لہذا ان میں سے ایک بازیافت کیا جاتا ہے۔ تاہم، اس بار، ہمیں ڈی بی اسٹوریج آرڈر میں پہلا ریکارڈ نہیں ملے گا. اس کے علاوہ ، فرض کریں کہ آپ ترجیحی ترتیب میں نام کی پہلی لائن ان شرائط کے تحت چاہتے ہیں کہ "نام میں @ مارک ہے" اور "نام میں حروف کی ایک چھوٹی تعداد ہے"۔

مندرجہ بالا شرط مندرجہ ذیل ایس کیو ایل کے ساتھ حاصل کی جاسکتی ہے۔ تاہم، ہم ذیلی سوالات کا استعمال کر رہے ہیں اور کارکردگی کی جانچ نہیں کی ہے.

select
  *
from
  (select *, row_number() over(order by ID asc) as RowNum from SampleTable) tableMain
where tableMain.RowNum =
(
  select
    top(1) RowNum
  from
    (select *, row_number() over(order by ID asc) as RowNum from SampleTable) tableSub
  where
        tableMain.ID = tableSub.ID
    and exists ( 
      select
        *
      from
        SampleTable
      where
        tableSub.ID = ID
      having
        count(*) >= 2
    )
  order by
    case when charindex(N'@', Name) >= 1 then 0 else 1 end, len(Name)
)

نقلی قطاروں کی جانچ پڑتال کی جاتی having ہے اور count . group by کلیدی کالم کو باہر سے چیک کیا جانا ہے، یہاں ID کالم کو کس طرح محدود کیا گیا ہے where .

پہلی قطار کو بازیافت کرنے کے لئے ترجیح کا ترتیب کس کے ذریعہ بیان کیا گیا ہے order by ۔ charindex یہاں ، اور len چیک کریں کہ آیا اس میں مخصوص کردار اور تار کی لمبائی شامل ہے۔ top آپ کو صرف ہر نقلی ریکارڈ کی پہلی قطار حاصل کرنے کی ضرورت ہے۔

اصل میں ، یہ ٹھیک ہے ، لیکن اگر بالکل ایک ہی قدر کے ساتھ دو یا زیادہ ریکارڈ موجود ہیں ، جیسے "آئی ڈی: 4 ، نام: 4@example.com نام"، تو آپ کو لازمی طور پر دو ریکارڈ ملیں گے۔ row_number لہذا ، اسے شامل کیا جاتا ہے تاکہ اسے ہر قطار کے ساتھ شناخت کیا جاسکے ، تاکہ بالکل اسی قدر کے ساتھ صرف ایک ریکارڈ بازیافت کیا جاسکے۔ اگر یہ معلوم ہے کہ بالکل وہی ریکارڈ موجود نہیں ہے تو ، میرے خیال میں row_number موجودہ ریکارڈ کی قدروں کو شامل کیے بغیر چیک کرنا بہتر ہوگا۔

اگر نقل کے لئے متعدد چابیاں چیک کرنے کے لئے ہیں تو ، آپ ہر ایک کے لئے کلیدی کالموں کی تعداد میں اضافہ کرسکتے ہیں۔ مثال کے طور پر، مندرجہ ذیل ریکارڈ پر غور کریں: ڈپلیکیٹ کے لئے چیک کیے جانے والے کالم "ID1" اور "ID2" ہیں۔

ID1 ID2 نام
1 1 نام 1
2 1 نام 2
3 1 نام 31
3 2 نام 32
4 1 نام 41
4 2 نام 42
4 2 نام 4@example.com
5 1 نام 555@example.com
5 1 نام 55@example.com
5 2 نام 5@example.com
6 1 نام 6
6 1 نام 66@example.com
6 2 نام 6
6 2 نام 6

حصول کا نتیجہ درج ذیل ہے۔

ID1 ID2 نام
4 2 نام 4@example.com
5 1 نام 55@example.com
6 1 نام 66@example.com
6 2 نام 6

ایس کیو ایل اس طرح نظر آتا ہے: آپ آسانی سے اس حصے میں اضافہ کرسکتے ہیں جہاں کلیدی کالم کی وضاحت کی گئی تھی۔

select
  *
from
  (select *, row_number() over(order by ID1 asc, ID2 asc) as RowNum from SampleTable) tableMain
where tableMain.RowNum =
(
  select
    top(1) RowNum
  from
    (select *, row_number() over(order by ID1 asc, ID2 asc) as RowNum from SampleTable) tableSub
  where
        tableMain.ID1 = tableSub.ID1
    and tableMain.ID2 = tableSub.ID2
    and exists ( 
      select
        *
      from
        SampleTable
      where
            tableSub.ID1 = ID1
        and tableSub.ID2 = ID2
      having
        count(*) >= 2
    )
  order by
    case when charindex(N'@', Name) >= 1 then 0 else 1 end, len(Name)
)