سؤال

وأنا أحاول الحصول على أعلى سجلات N لكل صف فريد من البيانات في الجدول (أنا التجميع على أعمدة <م> ب ، <م> ج و <م> د ، العمود <م> من هو معرف فريد والعمود <م> ه هي النتيجة التي أريد أعلى 1 في هذه الحالة).

a    b    c    d    e
2    38   NULL NULL 141
1    38   NULL NULL 10
1    38   1    NULL 10
2    38   1    NULL 1
1    38   1    8    10
2    38   1    8    1
2    38   16   NULL 140
2    38   16   12   140

ومنها مثلا. من هذه البيانات وأود أن تجد الصفوف التالية:

a    b    c    d    e
2    38   NULL NULL 141
1    38   1    NULL 10
1    38   1    8    10
2    38   16   NULL 140
2    38   16   12   140

ويمكن للشخص يرجى لي نقطة في الاتجاه الصحيح لحل هذا؟

هل كانت مفيدة؟

المحلول

لا تظهر سبيل المثال لديك، وأنت لا تفسر كيف يمكنك تحديد الصف الذي هو "أفضل" واحد، حتى لقد وضعت ؟؟؟؟؟؟ في الاستعلام حيث تحتاج إلى توفير عمود رفيع المستوى، مثل

a desc

وعلى سبيل المثال. في أي حال، وهذا هو بالضبط ما الدوال التحليلية في SQL Server 2005 و في وقت لاحق هي ل.

declare @howmany int = 3;
with TRanked (a,b,c,d,e,rk) as (
  select
    a,b,c,d,e,
    rank() over (
      partition by b,c,d
      order by ???????
    )
  from T
)
  select a,b,c,d,e
  from TRanked
  where rk <= @howmany;

نصائح أخرى

ووبلا قيم هي الألم، ولكن شيئا من هذا القبيل:

select * from table1 t1
where a in (
  select top 1 a from table1 t2
  where (t1.b = t2.b or (t1.b is null and t2.b is null))
    and (t1.c = t2.c or (t1.c is null and t2.c is null))
    and (t1.d = t2.d or (t1.d is null and t2.d is null))
  order by e desc
  )

وأو الأفضل من ذلك:

select * from (
  select *, seqno = row_number() over (partition by b, c, d order by e desc)
  from table1
  ) a
where seqno = 1

وأعتقد أن هذا سوف تفعل ما قلته (توسيع فكرة من <لأ href = "http://onlamp.com/pub/a/mysql/2007/03/29/emulating-analytic-aka-ranking-functions ؟ -مع-mysql.html الصفحة = 2 "يختلط =" نوفولو noreferrer "> هنا ):

select b,c,d,e, 
rank() over 
(partition by b,c,d order by e desc) "rank" 
from t1 where rank < 5

وابتهاج.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top