2017-01-11 2 views
-1

Ich habe eine Tabelle mit mehreren Punkten pro Strecke. Ich möchte die Anzahl der vollständigen Fahrten pro Strecke abrufen. Marker 1 -> 5 macht einen Trip.So überprüfen Sie die Anzahl der vollständigen Fahrten pro Strecke

Jeder Vorschlag wird sehr geschätzt.

enter image description here

+0

Ich würde überprüfen 'GROUP BY' und COUNT()'. – jarlh

+0

Können Sie garantieren, dass id immer in Ordnung ist? Wenn nicht, wie gruppieren Sie die Zeilen in einzelne Reisen? Beginnen die Trips auch immer mit Marker 1 und fahren mit Marker 5 fort? – iamdave

+0

@shanmugam Die Logik davon ist an die Reihenfolge gebunden, in der Marker hinzugefügt werden? Was passiert, wenn jemand 1 und 2 addiert (aber nicht 3, 4, 5) und dann jemand 3, 4 und 5 hinzufügt (sie haben 1, 2 nicht abgeschlossen)? Wie können Sie feststellen, ob das ein vollständiger Durchlauf oder zwei Teilläufe sind? – cloudsafe

Antwort

0

Wenn eine Reise von Marker beginnt immer 1 und throug Marker Schritt, aber es kann stoppt, bevor die endgültige Markierung erreicht, können Sie diese verwenden:

select routeid, count(marker) trip_n 
from RouteTable 
where marker=5 
group by routeid 

Wenn Marker „berührt“ von eine Reise ganz zufällig sind, aber Sie müssen zählen, wie viele komplette Sie haben, verwenden Sie diese:

;with 
g as (select distinct routeid from RouteTable), 
n as (select 1 n union all select 2 union all select 3 union all select 4 union all select 5), 
c as (
    select routeid, marker, count(marker) cnt 
    from RouteTable 
    group by routeid, marker 
), 
s as (
    select g.*, n marker, isnull(cnt,0) cnt 
    from g 
    cross join n 
    left join c on c.marker = n.n 
) 
select routeid, /*count(distinct marker) n_mark, */min(cnt) n_trip 
from s 
group by routeid 
+0

ok, meinst du wenn der marker 1-> 4 ist nicht komplett und du willst ihn nicht zählen? Kannst du Lücken haben? 1,3,5 ohne 2 und 4 ist möglich? – MtwStark

+0

danke für Ihren Vorschlag. Wenn ich auf der Suche nach kompletten Touren bin, sollte es keine fehlenden Markierungen in der Route geben. Und laut Ihrer Antwort, wenn Fahrten wie folgt passiert sind 2-> 5,3-> 5,1-> 5, ist die Anzahl der Fahrten falsch. – shan

+0

sollte nun funktionieren – MtwStark

0
select distinct m1.routeid, isnull(m2.[Trips],0) 
from [TableName] m1 
left join 
(SELECT routeid, count(*)/5 as [Trips] 
    FROM [Tablename] m 
    where 5 = (select count(distinct marker) 
    from [TableName] 
    where routeid=m.routeid) 
    group by routeid) m2 
    on m1.routeid=m2.routeid 

Added für dynamische Anzahl der Marker aus einem [Marker] Tabelle:

select distinct m1.routeid, isnull(m2.[Trips],0) 
from [TableName] m1 
left join 
(SELECT routeid, count(*)/5 as [Trips] 
    FROM [Tablename] m 
    where (select [no_of_markers] from [Markers] where [route_id]=m.route_id) = (select count(distinct marker) 
    from [TableName] 
    where routeid=m.routeid) 
    group by routeid) m2 
    on m1.routeid=m2.routeid 
+0

Was ist, wenn keine Markierung in der Route nicht fixiert ist? – shan

+0

es funktioniert nicht, wenn Sie 10 ID und nur 1 komplette Reise haben .. – MtwStark

+0

@shanmugam Nach meiner Überlegung müsste es andere Tabellen zu halten, Marker/Route Informationen, aber es gibt keine Erwähnung, so dass sie als fest sein müssen 5 Marker. – cloudsafe

Verwandte Themen