استفسار Oracle: احصل على أسماء مميزة مع العد أكبر من العتبة

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

سؤال

لدي طاولة تحتوي على مخطط أدناه

EmpID,MachineID,Timestamp
    1,        A,01-Nov-13
    2,        A,02-Nov-13
    3,        C,03-Nov-13
    1,        B,02-Nov-13
    1,        C,04-Nov-13
    2,        B,03-Nov-13
    3,        A,02-Nov-13

النتيجة المرجوة:

EmpID,MachineID
    1,        A
    1,        B
    1,        C
    2,        A
    2,        B
    3,        A
    3,        C

لذلك ، أريد أن أجد EMP التي استخدمت أكثر من آلات واحدة في الفترة الزمنية المحددة.

الاستعلام الذي أستخدمه

select EmpID,count(distinct(MachineID)) from table 
where Timestamp between '01-NOV-13' AND '07-NOV-13'
group by EmpID having count(distinct(MachineID)) > 1
order by count(distinct(MachineID)) desc;

هذا الاستعلام أعطاني إخراج مثل هذا

EmpID,count(distinct(MachineID))
    1,                        3
    2,                        2
    3,                        2   

هل يمكن لأي شخص أن يساعد في إجراء تغييرات للحصول على الإخراج كما هو موضح أعلاه في سؤالي.

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

المحلول

حل واحد ممكن:

CREATE TABLE emp_mach (
  empid NUMBER,
  machineid VARCHAR2(1),
  timestamp_val DATE
);

INSERT INTO emp_mach VALUES (1,'A', DATE '2013-11-01');
INSERT INTO emp_mach VALUES (2,'A', DATE '2013-11-02');
INSERT INTO emp_mach VALUES (3,'C', DATE '2013-11-03');
INSERT INTO emp_mach VALUES (1,'B', DATE '2013-11-02');
INSERT INTO emp_mach VALUES (1,'C', DATE '2013-11-04');
INSERT INTO emp_mach VALUES (2,'B', DATE '2013-11-03');
INSERT INTO emp_mach VALUES (3,'A', DATE '2013-11-02');

COMMIT;

SELECT DISTINCT empid, machineid
  FROM emp_mach
WHERE empid IN (
  SELECT empid
    FROM emp_mach
  WHERE timestamp_val BETWEEN DATE '2013-11-01' AND DATE '2013-11-07'
  GROUP BY empid
  HAVING COUNT(DISTINCT machineid) > 1
)
ORDER BY empid, machineid;

(لقد غيرت اسم timestamp عمود ل timestamp_val)

انتاج:

     EMPID MACHINEID
---------- ---------
         1 A         
         1 B         
         1 C         
         2 A         
         2 B         
         3 A         
         3 C  

نصائح أخرى

لقد فعلت أصعب. يجب استخدام استعلامك لتصفية النتائج:

SELECT t1.empid, t1.machineid
FROM
    table t1
WHERE
    EXIST (
        SELECT
            empid
        FROM table t2
        WHERE 
            timestamp BETWEEN '01-NOV-13' AND '07-NOV-13'
        AND t2.empid = t1.empid
        GROUP BY empid HAVING COUNT(distinct(machineid)) > 1
)
ORDER BY empid, machineid;

تحرير: نشر عدد قليل من Secs بعد Przemyslaw Kruglej. سأتركها هنا لأنها مجرد بديل آخر (باستخدام EXIST بدلاً من IN)

   SELECT * FROM
        (SELECT DISTINCT(EmpID),COUNT(*) AS NumEMP
        from TableA
        WHERE Timestamp between '01-NOV-13' AND '07-NOV-13'
        group by EmpID 
        order by EmpID
        )
   WHERE NumEmp >= 1
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top