2017-03-16 1 views
0

Ich habe SQL-Abfrage, die ich versuche, das Ergebnis RANG/GROUP angezeigt, nachdem es bestellt wurde.RANK/GROUP Ergebnis nach der Bestellung

Dies ist für einen Fall (UNIQSN), die von einem Speicherort (SLOC) zu einem anderen wechselt. Ich versuche chronologisch die Geschichte ihrer Reise zwischen Lagerorten zu erfassen.

"Code" ist mehr als tausend Worte wert!

habe ich versucht, die Abfrage unter:

SELECT 
    uniqsn, 
    SLOC, 
    Update_DATETIME, 
    RANK() OVER (PARTITION BY SLOC ORDER BY Update_DATETIME) RANKING 
FROM TABLE 

I

Get
UNIQSN SLOC UPDATE_DATETIME RANKING 
6039133 C114 2014/10/13 16:35:18 1 
6039133 C114 2015/02/23 07:58:22 2 
6039133 C119 2014/09/23 20:57:30 1 
6039133 C119 2014/09/23 20:57:57 2 
6039133 C119 2014/09/25 08:11:19 3 
6039133 C119 2015/01/29 17:39:50 4 
6039133 C119 2015/01/29 17:42:02 5 
6039133 C119 2015/01/30 09:01:02 6 
6039133 C119 2017/03/04 09:46:21 7 
6039133 C119 2017/03/04 09:46:28 8 
6039133 C119 2017/03/09 07:18:27 9 
6039133 C11M 2014/09/25 08:11:19 1 
6039133 C11M 2014/10/13 12:11:44 2 
6039133 C11M 2014/10/13 16:35:17 3 
6039133 C11M 2014/10/14 07:58:59 4 
6039133 C11M 2014/10/14 07:59:27 5 
6039133 C11M 2014/10/14 08:03:06 6 
6039133 C11M 2015/01/30 09:01:19 7 
6039133 C11M 2015/02/20 14:08:37 8 
6039133 C11M 2015/02/23 07:58:21 9 
6039133 C11M 2017/03/09 07:18:28 10 
6039133 C11Z 2014/10/14 08:03:07 1 

Stattdessen versuche ich, das Ergebnis unten zu erreichen. Kann jemand helfen?

UNIQSN SLOC UPDATE_DATETIME  RANKING 
6039133 C119 2014/09/23 20:57:30  1 
6039133 C119 2014/09/23 20:57:57  1 
6039133 C119 2014/09/25 08:11:19  1 
6039133 C11M 2014/09/25 08:11:19  2 
6039133 C11M 2014/10/13 12:11:44  2 
6039133 C11M 2014/10/13 16:35:17  2 
6039133 C114 2014/10/13 16:35:18  3 
6039133 C11M 2014/10/14 07:58:59  4 
6039133 C11M 2014/10/14 07:59:27  4 
6039133 C11M 2014/10/14 08:03:06  4 
6039133 C11Z 2014/10/14 08:03:07  5 
6039133 C119 2015/01/29 17:39:50  6 
6039133 C119 2015/01/29 17:42:02  6 
6039133 C119 2015/01/30 09:01:02  6 
6039133 C11M 2015/01/30 09:01:19  7 
6039133 C11M 2015/02/20 14:08:37  7 
6039133 C11M 2015/02/23 07:58:21  7 
6039133 C114 2015/02/23 07:58:22  8 
6039133 C119 2017/03/04 09:46:21  9 
6039133 C119 2017/03/04 09:46:28  9 
6039133 C119 2017/03/09 07:18:27  9 
6039133 C11M 2017/03/09 07:18:28  10 

Vielen Dank!

Antwort

1

Sie haben ein Lücken- und Inseln-Problem. Außerdem möchten Sie die Gruppen bis zum frühesten Datum (von dem, was ich sagen kann) bestellen.

Zu diesem Zweck:

select t.*, dense_rank() over (partition by uniqsqn order by min_ud) as ranking    
from (select t.*, 
      min(update_datetime) over (partition by uniqsqn, sloc, seqnum - seqnum_us) as min_ud 
     from (select t.*, 
        row_number() over (partition by unisqn order by update_datetime) as seqnum, 
        row_number() over (partition by uniqsqn, sloc order by update_datetime) as seqnum_us 
      from t 
      ) t 
    ) t; 
+0

Danke @Gordon, es war genau das, was ich suchte. –

0
;With Cte1 
AS 
(  
SELECT '6039133' AS UNIQSN, 'C114' AS SLOC, '2014/10/13 16:35:18' AS UPDATE_DATETIME UNION ALL 
SELECT '6039133', 'C114', '2015/02/23 07:58:22'          UNION ALL 
SELECT '6039133', 'C119', '2014/09/23 20:57:30'          UNION ALL 
SELECT '6039133', 'C119', '2014/09/23 20:57:57'          UNION ALL 
SELECT '6039133', 'C119', '2014/09/25 08:11:19'          UNION ALL 
SELECT '6039133', 'C119', '2015/01/29 17:39:50'          UNION ALL 
SELECT '6039133', 'C119', '2015/01/29 17:42:02'          UNION ALL 
SELECT '6039133', 'C119', '2015/01/30 09:01:02'          UNION ALL 
SELECT '6039133', 'C119', '2017/03/04 09:46:21'          UNION ALL 
SELECT '6039133', 'C119', '2017/03/04 09:46:28'          UNION ALL 
SELECT '6039133', 'C119', '2017/03/09 07:18:27'          UNION ALL 
SELECT '6039133', 'C11M', '2014/09/25 08:11:19'          UNION ALL 
SELECT '6039133', 'C11M', '2014/10/13 12:11:44'          UNION ALL 
SELECT '6039133', 'C11M', '2014/10/13 16:35:17'          UNION ALL 
SELECT '6039133', 'C11M', '2014/10/14 07:58:59'          UNION ALL 
SELECT '6039133', 'C11M', '2014/10/14 07:59:27'          UNION ALL 
SELECT '6039133', 'C11M', '2014/10/14 08:03:06'          UNION ALL 
SELECT '6039133', 'C11M', '2015/01/30 09:01:19'          UNION ALL 
SELECT '6039133', 'C11M', '2015/02/20 14:08:37'          UNION ALL 
SELECT '6039133', 'C11M', '2015/02/23 07:58:21'          UNION ALL 
SELECT '6039133', 'C11M', '2017/03/09 07:18:28'          UNION ALL 
SELECT '6039133', 'C11Z', '2014/10/14 08:03:07' 
) 
,Cte2 
AS 
(
SELECT 
    uniqsn, 
    SLOC, 
    Update_DATETIME, 
    RANK() OVER (PARTITION BY SLOC ORDER BY Update_DATETIME) RANKING 
FROM Cte1 
) 
SELECT * from Cte2 Order by RANKING 
+0

Das ist die gleiche Abfrage von meinem Post, die nicht funktioniert hat. –

Verwandte Themen