2017-06-11 1 views
2

J'ai une table dans SQL Server comme this-Classement lignes de la table SQL Server Lorsqu'une colonne Valeur Changements

ID Employee_id group_field_code from_date    To_date 
================================================================================ 
1 44855   055   2015-04-01 00:00:00 2015-04-02 17:37:26 
2 44855   055   2015-04-02 17:37:27 2015-04-25 09:31:10 
3 44855   055   2015-04-25 09:31:11 2015-09-18 14:58:59 
4 44855   053   2015-09-18 15:00:00 2016-04-02 02:58:59 
5 44855   055   2016-04-02 03:00:00 2016-05-26 02:58:59 
6 44855   055   2016-05-25 13:25:23 2016-09-07 14:58:59 
7 44855   055   2016-05-26 03:00:00 2016-05-25 13:25:22 
8 44855   052   2016-09-07 15:00:00 2017-05-22 02:58:59 
9 44855   055   2017-05-22 03:00:00 NULL 

Tout ce que je veux est nouveau rang pour une ligne lorsque les changements sur le terrain du groupe. Comme- Pour ID 1-3 (code_groupe 55) je veux un rang, pour ID 4 (groupe_Code change, 53) je veux un autre rang, puis à nouveau pour ID 5 (code_groupe 5 ré-arrive) je veux un autre rang et ainsi de suite. Est-ce possible dans SQL Server en utilisant Rank ou une autre fonction?

Répondre

1

Nous pouvons essayer d'utiliser la différence de la méthode de numéros de ligne:

SELECT 
    ID, Employee_id, group_field_code, from_date, To_date, 
    DENSE_RANK() OVER (ORDER BY rank) rank 
FROM 
(
    SELECT *, 
     ROW_NUMBER() OVER (ORDER BY from_date) - 
     ROW_NUMBER() OVER (PARTITION BY group_field_code ORDER BY from_date) AS rank 
    FROM yourTable 
) t 
ORDER BY t.from_date; 

Demo ici:

Rextester

1
`SELECT dt.*, 
     sum(dt.rnk) over (
         ORDER BY dt.id ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS final_rnk 
FROM 
    (SELECT e2.*, 
      CASE 
      WHEN e1.group_field_code <> e2.group_field_code THEN 1 
      ELSE 0 
     END AS rnk 
    FROM employee e1 
    INNER JOIN employee e2 ON e1.id = e2.id-1) dt ;` 

result