تعليمات استعلام SQL:اختيار الصفوف التي تظهر لعدد معين من المرات

StackOverflow https://stackoverflow.com/questions/104971

  •  01-07-2019
  •  | 
  •  

سؤال

لدي جدول به عمود "التاريخ".قد يظهر كل تاريخ عدة مرات.كيف أختار فقط التواريخ التي تظهر < k عدد المرات؟

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

المحلول

select dates 
  from table t 
 group by dates having count(dates) < k ;

نأمل أن يعمل مع ORACLE.هث

نصائح أخرى

SELECT * FROM [MyTable] WHERE [Date] IN
(
    SELECT [Date] 
    FROM [MyTable] 
    GROUP By [Date] 
    HAVING COUNT(*) < @Max
)

راجع استجابة @[SQLMenace] أيضًا.إنه مشابه جدًا لهذا، ولكن اعتمادًا على قاعدة البيانات الخاصة بك، من المحتمل أن يتم تشغيل JOIN الخاص به بشكل أسرع، على افتراض أن المحسن لا يجعل الفرق موضع نقاش.

استخدم إجمالي COUNT:

SELECT Date
FROM SomeTable
GROUP BY Date
HAVING COUNT(*) < @k

مثال

DECLARE @Max int
SELECT @Max =  5

SELECT t1.* 
FROM [MyTable] t1 
JOIN(
    SELECT [Date] 
    FROM [MyTable] 
    GROUP By [Date] 
    HAVING COUNT(*) < @Max
) t2 on t1.[Date]  = t2.[Date] 

بالنسبة للاستعلامات "يظهر x مرات" فمن الأفضل استخدام جملة HAVING.في حالتك، يمكن أن يكون الاستعلام مثل:

SELECT Date FROM table GROUP BY Date HAVING COUNT(*)<k

أو تحتاج إلى تحديد أعمدة أخرى باستثناء التاريخ:

SELECT * FROM Table WHERE Date IN (
SELECT Date FROM table GROUP BY Date HAVING COUNT(*)<k)

يمكنك أيضًا إعادة كتابة IN إلى INNER JOIN، ولكن هذا لن يعطي زيادة في الأداء، حيث في الواقع، سيقوم مُحسِّن الاستعلام بذلك نيابةً عنك في معظم RDBMS.من المؤكد أن وجود فهرس في التاريخ سيؤدي إلى تحسين أداء هذا الاستعلام.

SELECT date, COUNT(date)
FROM table
GROUP BY date
HAVING COUNT(date) < k

ومن ثم لاستعادة البيانات الأصلية:

SELECT table.*
FROM table
INNER JOIN (
  SELECT date, COUNT(date) 
  FROM table
  GROUP BY date
  HAVING COUNT(date) < k) dates ON table.date = dates.date

بافتراض أنك تستخدم Oracle، و k = 5:-

select date_col,count(*)
from your_table
group by date_col
having count(*) < 5;

إذا كان عمود التاريخ الخاص بك ممتلئًا بالوقت أيضًا، وتريد تجاهله، فقم بتعديل الاستعلام بحيث يبدو كما يلي: -

select trunc(date_col) as date_col,count(*)
from your_table
group by trunc(date_col)
having count(*) < 5;

قد لا تتمكن من العد مباشرةً في حقل التاريخ إذا كانت التواريخ تتضمن أوقاتًا.قد تحتاج إلى التحويل إلى تنسيق السنة/الشهر/اليوم فقط أولاً ثم القيام بالعد على ذلك.

وإلا فسيتم إيقاف حساباتك حيث يوجد عادةً عدد قليل جدًا من السجلات في نفس الوقت بالضبط.

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