2016-06-02 7 views
-1

ich mit einem SQL-Code stecke, wo ich brauche te Daten zu erhalten, wie folgt (ich hoffe, dass ich es gut genug erklären kann): Es gibt drei Tabellen in meiner Datenbank:SQL aus Tabelle zählen erhalten 1, wo komplizierte

Table 1 is filled with traffic accidents(VKL_NUMBER and TIME) 
Table 2 is filled with the locations of the accidents and the closest weather station (VKL_NUMBER, LOCATION and STN_NUMBER) 
Table 3 is filled with weather data and the weather station where it came from(STN_NUMBER, TIME, WEATHER_TYPE) 

Ich muss die Anzahl der Unfälle zählen, wo es regnet. Die Schlüssel zu den Tabellen sind:

From 1 to 2: VKL_NUMBER(accident number) 
From 2 to 3: STN_NUMBER (weather station number) 

Wie kann ich die weathertype zum Zeitpunkt und am nächsten an den Unfall in einer Zählung Wie erhalten:

Count accidents where it rains at the closest weatherstation. 

für weitere Informationen:

The accidents table has VKL_NUMBER(FK to the locations table) TIME(HHMM format) and DATE(YYMMDD format) 
The locations table has VKL_NUMBER(FK to accidents), LOCATION(not important for this question) and STN_NUMBER(FK to the weather table) 
The weather table had STN_NUMBER(FK to locations table), WEATHERTYPE("rain","snow","hail"), TIME(HHMM format) and DATE(YYMMDD format) 
+0

Wenn Sie sagen "wo es regnet", können Sie konkret sagen, welche Spalte diese Informationen bereitstellt? Gleiches gilt für andere Felder. – Adi

+0

Die Unfalltabelle hat VKL_NUMBER (FK für die Lokationstabelle) TIME (HHMM Format) und DATE (YYMMDD Format) Die Lokationstabelle hat VKL_NUMBER (FK für Unfälle), LOCATION (nicht wichtig für diese Frage) und STN_NUMBER (FK für die Frage) Wetter Tabelle) Die Wetter Tabelle hatte STN_NUMBER (FK zu Standorten Tabelle), WEATHERTYPE ("regen", "Schnee", "Hagel"), TIME (HHMM Format) und DATE (YYMMDD Format) –

+0

Warum sind die Tabellen 1 und 2 getrennt ? – Strawberry

Antwort

1
/* apparently you'll need to combine and cast the <date + time> values */ 
select count(case when weather.weathertype = 'rain' then 1 end) 
from 
(
    select 
     accidents.vkl_number, 
     min(<accidents.date + accidents.time>) as time_of_accident, 
     min(weather.stn_number) as stn_number, 
     max(timestampdiff(minute, 
       <weather.date + weather.time>, 
       <accidents.date + accidents.time> 
     )) as differential 
    from 
     t1 accidents inner join t2 accident_locations 
      on accident_locations.vkl_number = accidents.vkl_number 
     inner join t3 weather 
      on weather.stn_number = accident_locations.stn_number 
       and weather.time <= accidents.time 
    group by accidents.vkl_number 
) closest 
    inner join t3 weather 
     on weather.stn_number = closest.stn_number 
      and date_add(
        <weather.date + weather.time>, 
        interval differential second 
       ) = closest.time_of_accident 

Ich gehe davon aus Sie den Bahnhof Zeit kurz vor dem Unfall soll. Das Brechen von Verbindungen ist eine erhebliche Komplikation und wir benötigen mehr Informationen über Ihre gewünschte übereinstimmende Logik.

0

Ich nehme an, dass es viel mehr Zeiten in der Wetterstation Tabelle gibt. Und wahrscheinlich nicht für jede Minute. Sie können also wahrscheinlich nicht direkt an den Zeitfeldern den Tabellen beitreten, ohne einige Übereinstimmungen zu verpassen.

Die folgende Abfrage wurde nicht getestet und wurde nur in Notepad geschrieben.
Aber ich nehme an, es würde ungefähr so ​​aussehen.
Beachten Sie, dass die Zeiten im Stundenabschnitt der Zeitfelder verknüpft sind.

select wc.weather_type, acc.date, count(distinct acc.vkl_number) 
from traffic_accidents acc 
inner join location_accidents loc on (acc.vkl_number = loc.vkl_number) 
inner join weather_data ws on (loc.stn_number = ws.stn_number) 
where acc.date = ws.date 
and substring(acc.time,0,2) = substring(ws.time,0,2) 
and ws.weather_type = 'rain' 
and acc.date = '160602' 
group by ws.weather_type, acc.date; 
+0

Hallo luk. Die Zeit ist nicht der Schlüssel in diesen Tabellen. Es ist Von 1 bis 2: VKL_NUMBER (Unfallnummer) Von 2 bis 3: STN_NUMBER (Wetterstation Nummer) –

+0

Und diese Verbindung mit STN_number ist in der zweiten Join. Aber du musst schauen, was in diesem Wetterstation Tisch ist. Wenn Sie nach Unfällen zu der Zeit suchen, in der es geregnet hat, müssten Sie nicht auch die Zeit in diesem Wettertisch berücksichtigen? – LukStorms

Verwandte Themen