2017-01-04 3 views
1

Ich weiß, es gibt viele Antworten, aber keine von mir. Mein Tisch sah aus wieSQL Transpose Zeilen zu Spalten ohne Aggregat

enter image description here

wo wir Meter speichern und Ausschalten gegebenen Zeitstatus. Nach jedem Aus-Status gibt es einen Ein-Status. Wir wollen Tabelle transponieren wie diese

MeterNo |  [power off]  |   [power on] 
____________________________________________________________________ 
    x0039938 | 2016-10-08 14:14:37.610 | 2016-10-08 14:17:15.047 
____________________________________________________________________ 
    x0039938 | 2016-10-08 14:20:50.257 | NULL 
____________________________________________________________________ 
    x0039938 | 2016-10-08 14:23:07.610 | 2016-10-08 14:23:17.920 
____________________________________________________________________ 
    x0039940 | 2016-10-08 15:45:38.250 | 2016-10-08 15:52:40.080 
____________________________________________________________________ 

und so weiter

habe ich versucht, diese Abfrage

SELECT * 
    FROM 
(
    SELECT MeterNo, Status, CreatedOn 
    FROM [BreakdownShutdowDetails] 
) s 
PIVOT 
(
    MAX(CreatedOn) FOR Status IN ([power off], [power on]) 
) p 

, die pro meterno wie diese

enter image description here

nur auf Ergebnis gibt

Grundlegende Idee, um die Dauer zwischen Aus und Ein zu erhalten jeder Meter. Bitte für die richtige Abfrage vorschlagen. Danke.

Update 1 Beispieldaten

1 x0039938 power off 2016-10-08 14:14:37.610 
2 x0039938 power on 2016-10-08 14:17:15.047 
3 x0039938 power off 2016-10-08 14:20:50.257 
4 x0039938 power off 2016-10-08 14:23:07.610 
5 x0039938 power on 2016-10-08 14:23:17.920 
6 x0039940 power off 2016-10-08 15:45:38.250 
7 x0039940 power on 2016-10-08 15:52:40.080 
8 x0040281 power off 2016-10-08 15:59:26.513 
9 x0040281 power on 2016-10-08 16:20:23.323 
10 x0039940 power off 2016-10-08 16:26:29.133 
19 x0040281 power off 2016-10-08 17:17:48.900 
22 x0039937 power off 2016-10-08 17:24:24.617 
23 x0039937 power on 2016-10-08 17:24:38.590 
24 x0039937 power off 2016-10-08 17:33:31.843 
25 x0039937 power on 2016-10-08 17:35:47.470 
27 x0039940 power off 2016-10-08 17:37:18.360 
28 x0040281 power on 2016-10-08 17:40:08.093 
30 x0043637 power off 2016-10-09 14:32:23.130 
31 x0039937 power off 2016-10-09 14:32:24.893 
32 x0040281 power off 2016-10-09 14:32:27.387 
33 x0039940 power off 2016-10-09 14:32:29.407 
34 x0040281 power on 2016-10-09 15:01:42.480 
+0

Dies sieht aus wie ein Lücken und Inseln Problem. –

+0

Was ist die Version von SQL-Server? – Viki888

+0

@ Viki888 SQL Server 2008 –

Antwort

1

es nannte als Gaps and islands Problem allgemein genannt. Versuchen Sie so etwas (nicht getestet)

SELECT MeterNo, 
     [power off] = Min(CASE 
          WHEN status = 'power off' THEN CreatedOn 
         END), 
     [power on] = Min(CASE 
          WHEN status = 'power on' THEN CreatedOn 
         END) 
FROM (SELECT *, 
       Row_number() OVER (partition BY MeterNo ORDER BY CreatedOn) - 
       Dense_rank() OVER (partition BY MeterNo ORDER BY status) AS seq_grp 
     FROM Yourtable) t 
GROUP BY MeterNo, 
      seq_grp 
+0

bereitstellen Beispieldaten –

+0

@ صصي - Hast du es getestet? –

+0

Danke Kumpel Es funktioniert gut. –