2017-06-14 2 views
0

Ich habe eine Tabelle „Zusammenfassung“, die die folgenden Informationendie EmpID Picking, die max Sequenznummer = -1 für 8/4

Sumid(pk) Empid(fk) Year Quarter Seqnumber amount 
101  1001  2015  1   -1  1000 
102  1001  2015  1   0  2000 
103  1001  2015  1   1  3000 
104  1001  2015  1   2  4000 
105  1002  2015  1   -1  6000 
105  1002  2015  2   -1  7000 
105  1002  2015  3   -1  8000 
105  1002  2015  4   -1  9000 
105  1002  2016  1   -1  10000 
105  1002  2016  2   -1  11000 
105  1002  2016  3   -1  12000 
105  1002  2016  4   -1  13000 
Output: 

Empid(fk) 
1002 

Bussiness Regel hat: Wir müssen die EmpID deren max (Seqnumber) holen = -1 auf der ganzen Linie für 8 Quartale (rückwärts gehen) dh In diesem Beispiel 1002 beginnend im vierten Quartal 2016 bis 2015 ersten Quartal hat es nur "-1" als max (SeqNumber), also müssen wir diese empid auswählen.

+0

Welche Version von SQL Server verwenden Sie? –

+0

sql server 2014 –

Antwort

1

In SQL Server 2012+, können Sie sie nur Funktionen zählen Fenster:

select distinct empid; 
from (select t.*, 
      max(seqnum) over (partition by empid rows between 7 preceding and current row) as max_seqnum8 
     from t 
    ) t 
where max_seqnum8 = -1 
+0

es funktioniert nicht zeigt Fehler in der Nähe von aktuellen –

+1

@MunnaDonepudi Eine kleine Variation von diesem, die für Ihre Bedürfnisse funktionieren sollte: http://realteter.com/QLGV94647 – ZLK

0

Sie diese verwenden können, wenn Viertel> = 8

SELECT 
Empid 
FROM summary 
WHERE Empid NOT IN 
(
SELECT Empid FROM summary GROUP BY Empid HAVING MAX(Seqnumber) <> -1 
) 
GROUP BY Empid 
HAVING COUNT(*) >= 8 

Sie diese verwenden können, wenn Viertel = 8

SELECT 
Empid 
FROM summary 
WHERE Empid NOT IN 
(
SELECT Empid FROM summary GROUP BY Empid HAVING MAX(Seqnumber) <> -1 
) 
GROUP BY Empid 
HAVING COUNT(*) = 8 
0
;With cte(Sumid,Empid,[Year],[Quarter],Seqnumber,amount) 
AS 
(
SELECT 101, 1001,2015 ,1,1 ,1000 Union all 
SELECT 102, 1001,2015 ,1,0 ,2000 Union all 
SELECT 103, 1001,2015 ,1,1 ,3000 Union all 
SELECT 104, 1001,2015 ,1,2 ,4000 Union all 
SELECT 105, 1002,2015 ,1,-1 ,6000 Union all 
SELECT 105, 1002,2015 ,2,-1 ,7000 Union all 
SELECT 105, 1002,2015 ,3,-1 ,8000 Union all 
SELECT 105, 1002,2015 ,4,-1 ,9000 Union all 
SELECT 105, 1002,2016 ,1,-1 ,10000 Union all 
SELECT 105, 1002,2016 ,2,-1 ,11000 Union all 
SELECT 105, 1002,2016 ,3,-1 ,12000 Union all 
SELECT 105, 1002,2016 ,4,-1 , 13000 
) 
SELECT TOP 1 Empid From 
--MAX(CountSeqnumber)OVER(PARTITION BY Empid ORDER BY Empid Desc) AS MaxSeq 
(
SELECT *, COUNT(Seqnumber)Over(Partition by Empid Order by Empid) AS CountSeqnumber FROM cte 
)Dt 
ORDER BY Dt.Empid DESC 
Verwandte Themen