Avatar billede michaeljuhl Nybegynder
08. oktober 2012 - 09:38 Der er 11 kommentarer og
1 løsning

Returnere kun en forekomst af en given datetime kombineret med et nr. samt et iID nr.

Jeg skal finde et "NR" udfra en given datetime imellem en startime og sluttime plus 10 min, hvordan er det muligt kun at få en forekomst ud af dette selvom der er forskellige iID'er, det skal være den første forekommende Startime.

Timestamp og nr er i en tb, og Starttime, Stoptime og iID er i en anden tb, plus yderligere to tb'er

Så resultatet skulle gerne kun være denne første:
Timestamp    Starttime    Stoptime    User_ID    NR    iID
2012-09-13 13:36:38.010    2012-09-13 13:27:39.953    2012-09-13 13:30:20.763    MJH    7245    77239


Jeg har denne SQL syntaks, jeg håber der er en der kan hjælpe mig med at modificere denne :-)

SELECT DISTINCT dbo.T1.Timestamp, dbo.T2.StartTime, dbo.T2.StopTime, dbo.T1.User_ID, dbo.T1.NR, dbo.T2.iID
FROM        dbo.T1 INNER JOIN
                      dbo.T2 INNER JOIN
                      dbo.T3 ON dbo.T2.iID = dbo.T3.RID INNER JOIN
                      dbo.T4 ON dbo.T2.iUserID = dbo.T4.iUserId ON dbo.T1.User_ID = dbo.T4.OsLogin
WHERE    (dbo.T1.Timestamp BETWEEN DATEADD(MINUTE, 0, dbo.T2.StartTime) AND DATEADD(MINUTE, 10, dbo.T2.StopTime))



Timestamp    Starttime    Stoptime    User_ID    NR    iID
2012-09-13 13:36:38.010    2012-09-13 13:27:39.953    2012-09-13 13:30:20.763    MJH    7245    77239
2012-09-13 13:36:38.010    2012-09-13 13:30:42.297    2012-09-13 13:30:53.840    MJH    7245    57754
2012-09-13 13:36:38.010    2012-09-13 13:31:58.513    2012-09-13 13:32:08.200    MJH    7245    47780
2012-09-13 13:36:38.010    2012-09-13 13:32:27.870    2012-09-13 13:33:25.700    MJH    7245    27703
2012-09-13 13:36:38.010    2012-09-13 13:34:59.730    2012-09-13 13:35:38.510    MJH    7245    35258

På forhånd mange tak for hjælpen.
Michael
Avatar billede The Real Yoda Juniormester
08. oktober 2012 - 09:48 #1
Er lidt rusten i msSql syntax..

men det kunne måske være

SELECT TOP(1) DISTINCT dbo.T1.Timestamp, dbo.T2.StartTime, dbo.T2.StopTime, dbo.T1.User_ID, dbo.T1.NR, dbo.T2.iID
FROM        dbo.T1 INNER JOIN
                      dbo.T2 INNER JOIN
                      dbo.T3 ON dbo.T2.iID = dbo.T3.RID INNER JOIN
                      dbo.T4 ON dbo.T2.iUserID = dbo.T4.iUserId ON dbo.T1.User_ID = dbo.T4.OsLogin
WHERE    (dbo.T1.Timestamp BETWEEN DATEADD(MINUTE, 0, dbo.T2.StartTime) AND DATEADD(MINUTE, 10, dbo.T2.StopTime)) ORDER BY StartTime ASC

Eller

SELECT DISTINCT dbo.T1.Timestamp, dbo.T2.StartTime, dbo.T2.StopTime, dbo.T1.User_ID, dbo.T1.NR, dbo.T2.iID
FROM        dbo.T1 INNER JOIN
                      dbo.T2 INNER JOIN
                      dbo.T3 ON dbo.T2.iID = dbo.T3.RID INNER JOIN
                      dbo.T4 ON dbo.T2.iUserID = dbo.T4.iUserId ON dbo.T1.User_ID = dbo.T4.OsLogin
WHERE    (dbo.T1.Timestamp BETWEEN DATEADD(MINUTE, 0, dbo.T2.StartTime) AND DATEADD(MINUTE, 10, dbo.T2.StopTime)) ORDER BY StartTime ASC LIMIT 1
Avatar billede michaeljuhl Nybegynder
08. oktober 2012 - 10:27 #2
Den første hvor jeg lige bytter om på TOP(1) Distinct med Distinct TOP(1) først, vil virke på en forekomst i hele query'en. men jeg skal bruge en forekomst af hver gruppe "TimeStamp", jeg håber det er til at forstå jvnf. nedenstående.

Og ellers mange tak for din tilbagemeelding.

Timestamp    StartTime    StopTime    User_ID    NR    iID
2012-09-13 13:23:26.747    2012-09-13 13:20:49.787    2012-09-13 13:21:08.693    MJH        5775    33679
2012-09-13 13:23:26.747    2012-09-13 13:21:10.817    2012-09-13 13:25:05.317    MJH        5775    12306
2012-09-13 13:31:30.203    2012-09-13 13:21:10.817    2012-09-13 13:25:05.317    MJH        1196    12306
2012-09-13 13:31:30.203    2012-09-13 13:27:16.627    2012-09-13 13:27:38.377    MJH        1196    77239
08. oktober 2012 - 10:28 #3
Dette ligger udenfor dit spørgsmål, men jeg kan ikke dy mig:  Så vidt jeg kan se bruger du ikke nogen data fra tabellerne T3 eller T4 i denne sql forespørgsel, så i tilslutning til #1 vil jeg foreslå, at du prøver denne simplere forespørgsel:

SELECT T1.Timestamp, T2.StartTime, T2.StopTime, T1.User_ID, T1.NT, T2.iID
FROM T1
JOIN T2 ON T1.Timestamp BETWEEN T2.StartTime AND DATEADD(MINUTE, 10, dbo.T2.StopTime)
ORER BY StartTime ASC LIMIT 1

Afhængigt af hvilke data du har i dine tabeller er det muligt, at du er nødt til at bruge SELECT DISTINCT.
Avatar billede michaeljuhl Nybegynder
08. oktober 2012 - 12:05 #4
MSSQL kender ikke LIMIT som er MYSQL syntaks :-)

jeg har prøvet med Distinct, det er korrekt at jeg ikke lige bruge data fra t3 og t4, dissse bruges kun til at joine user med :-)

Men tak fordi du prøvede.
08. oktober 2012 - 13:04 #5
Ja, naturligvis, LIMIT er mysql.  Beklager.  Og det er naturligvis kun op til dig selv hvordan du joiner.  Det jeg observerer er, at alle de seks felter du vil have skrevet ud befinder sig i T1 og T2, og de to tabeller kan du tilsyneladende joine direkte.  Du skulle således få samme resultat ud af din forespørgsel hvadenten du kun joiner T1 og T2 eller du joiner med T3 og T4 også.  Eller tager jeg fejl?
Avatar billede michaeljuhl Nybegynder
08. oktober 2012 - 13:36 #6
Du har ret i at t3 ikke bruges umiddelbart, men t4 bruges som join imellem t1 og t2 her joines på userID og OSLogin, så t4 skal med i udtrykket :-)
Avatar billede arne_v Ekspert
08. oktober 2012 - 15:53 #7
SELECT ... LIMIT 1

kan nemt laves som:

SELECT TOP 1 ...
Avatar billede michaeljuhl Nybegynder
09. oktober 2012 - 14:44 #8
Jeg er ked af at jeg ikke fik formuleret mig korrekt i mit spørgsmål, så det er nok bedst at jeg lukker dette spørgsmål og oprette et nyt, eller er der andre der har en bedre ide, f.eks at ændre spørgsmåls fomuleringen :-)
Avatar billede michaeljuhl Nybegynder
09. oktober 2012 - 14:46 #9
Hej Arne_v
Jeg har prøvet med Top 1 og "min" og mange andre ting, jeg kan bare ikke få det til at fungere. :-)
09. oktober 2012 - 15:19 #10
Hvis du mener du kan tydeliggøre problemstillingen ved at omformulere spørgsmålet, med et frisk spørgsmål får du frisk opmærksomhed fra Ekspertens medlemmer.  Hvad du måtte omformulere her bliver sandsynligvis kun set af de der allerede deltager i tråden.
Avatar billede michaeljuhl Nybegynder
09. oktober 2012 - 15:28 #11
Returnere kun en forekomst fra en gruppe af en given datetime kombineret med et nr. samt et iID nr.
Jeg skal finde et "iID" udfra en given datetime (TimeStart) imellem en starttime og en sluttime plus 10 min, hvordan er det muligt kun at få en forekomst af hver gruppe ud af dette, selvom der er forskellige iID'er, og tiden overlapper hinanden, det skal være den første forekommende Starttime, nå iID er fundet og  brugt skal der helst ikke søges mere på denne i resten  af forespørgelsen. :-)

Timestamp, NR og UserID er i t1, og Starttime, Stoptime, UserID og iID er i t2,

Så resultatet skulle gerne kun være den første forespørgelsen finder i hver gruppe, tiden der søges for er = (Where) :
Timestamp           Starttime              Stoptime          UserID    NR      iID
2012-09-13 13:36:38.010    2012-09-13 13:27:39.953    2012-09-13 13:30:20.763  MJH       7245    77239
2012-09-13 13:37:48.001    2012-09-13 13:32:58.513    2012-09-13 13:33:08.200  JHM      8245    77780


Jeg har denne SQL syntaks, jeg håber der er en der kan hjælpe mig med at modificere denne :-)


SELECT DISTINCT dbo.T1.Timestamp, dbo.T2.StartTime, dbo.T2.StopTime, dbo.T1.UserID, dbo.T1.NR, dbo.T2.iID
FROM        dbo.T1 INNER JOIN
                      dbo.T2 INNER JOIN
                      dbo.T1 ON dbo.T2.iUserID = dbo.T1.iUserId
WHERE    (dbo.T1.Timestamp BETWEEN DATEADD(MINUTE, 0, dbo.T2.StartTime) AND DATEADD(MINUTE, 10, dbo.T2.StopTime))

Join af t1 og t2 med UserID
Timestamp              Starttime                  Stoptime            UserID NR     iID
2012-09-13 13:36:38.010    2012-09-13 13:27:39.953    2012-09-13 13:30:20.763    MJH    7245    77239
2012-09-13 13:36:38.010    2012-09-13 13:30:42.297    2012-09-13 13:30:53.840    MJH    7245    57754
2012-09-13 13:36:38.010    2012-09-13 13:31:58.513    2012-09-13 13:32:08.200    MJH    7245    47780
2012-09-13 13:37:48.001    2012-09-13 13:32:58.513    2012-09-13 13:33:08.200    JHM    8245    77780
2012-09-13 13:37:48.001    2012-09-13 13:33:27.870    2012-09-13 13:34:25.700    JHM    8245    87703
2012-09-13 13:37:48.001    2012-09-13 13:34:59.730    2012-09-13 13:35:38.510    JHM    8245    95258

t1
Timestamp              UserID  NR
2012-09-13 13:36:38.010    MJH      7245
2012-09-13 13:37:48.001    JHM      8245

t2
Starttime              Stoptime            UserID     iID
2012-09-13 13:27:39.953    2012-09-13 13:30:20.763    MJH    77239
2012-09-13 13:30:42.297    2012-09-13 13:30:53.840    MJH    57754
2012-09-13 13:31:58.513    2012-09-13 13:32:08.200    MJH    47780
2012-09-13 13:32:58.513    2012-09-13 13:33:08.200    JHM    77780
2012-09-13 13:33:27.870    2012-09-13 13:34:25.700    JHM    87703
2012-09-13 13:34:59.730    2012-09-13 13:35:38.510    JHM    95258
Avatar billede michaeljuhl Nybegynder
17. oktober 2012 - 09:35 #12
Jeg lukker spørgsmålet og giver
therealyoda
point, da han kom tættest på med en løsning, jeg skal dog arbejde videre med den, da den ikke helt har løst mit problem :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester