[SQL] vragen: 1. volgende rij 2. binnen een uur

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • MarijnvdZaag
  • Registratie: Juli 2004
  • Laatst online: 30-07 19:29
Ik heb twee vragen over queries (die in Access moeten werken).

Voor de volledigheid even de velden van de tabel waar het over gaat. Het is een logfile van gebruik van een elektronisch patientendossier:
ID | patient_registratienummer | gebruiker_code | pcprId | section_id | action | specialisme | parent | responsible_provider_type | datum_tijd


1. Als ik de rij wil hebben NA een bepaalde rij waar ik condities voor opgeef, hoe doe ik dat?
De query is "Welk tabblad wordt het vaakst geopend na (in tijd) het openen van het tabblad 'Decursus'".
Dit dacht ik eerst opgelost te hebben met onderstaande query, waarin ik gebruikmaak van het feit dat ID een unieke waarde is die de volgorde van acties aangeeft:

SELECT section_id, COUNT(*)
FROM EPD
WHERE ID IN (SELECT ID+1 FROM EPD WHERE section_id = 'eadDecursus')
GROUP BY section_id
ORDER BY COUNT(*) DESC


De truc is hier dus ID+1. Het probleem is, dat ik er niet aan dacht dat meerdere mensen tegelijk aan het systeem kunnen zitten. Daarom dacht ik dan wel eventjes te sorteren op gebruiker_code. Het probleem is, dat dan de ID's niet meer op volgorde staan! Dus dan werkt ID+1 niet meer. Hoe krijg ik dan steeds de eerstvolgende rij?


2. Tweede vraag gaat over tijdbestek.
De query: "welke gebruikers doen schrijfacties voor meer dan twee patienten binnen een half uur".
Het eerste probleem is eigenlijk een beetje wiskundig, namelijk dat je geen begintijd weet, maar alleen een eindtijd kan geven voor een gegeven begintijd (die ook uit de log moet komen). Maar daar denk ik zelf wel over na en dan vraag ik hier: hoe kan je een conditie als 'tijd/datum is minder dan een half uur na bepaalde tijd/datum' in SQL zetten? Of misschien moet ik de vraag formuleren als 'hoe tel ik tijd op bij een datum/tijd?'.


Vast hartelijk bedankt als je de moeite neemt me hiermee te helpen.

[ Voor 2% gewijzigd door MarijnvdZaag op 20-04-2010 04:53 . Reden: verduidelijking ]


Acties:
  • 0 Henk 'm!

  • Tharulerz
  • Registratie: April 2009
  • Laatst online: 10-04 05:16
Je vragen zijn vrij cryptisch vind ik, en je tabeldata is vrij summier.

Misschien is het handig om te weten voor 1. dat je kan sorteren op meerdere kolommen? Dus eerst op id en dan pas op gebruiker_code?

Acties:
  • 0 Henk 'm!

  • MarijnvdZaag
  • Registratie: Juli 2004
  • Laatst online: 30-07 19:29
ID is een autonummering, bovendien geven die nummers ook precies de volgorden aan waarin acties zijn gedaan. ID is dus uniek.

Als nog meer niet duidelijk is, hoor ik het graag.

[ Voor 8% gewijzigd door MarijnvdZaag op 08-04-2010 16:50 ]


Acties:
  • 0 Henk 'm!

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
"Welk tabblad wordt het meest geopend na het tabblad 'Decursus'".

Bedoel je nu dat tabblad 'Decursus' het meest wordt opgevraagd en dat je nummer twee wilt? Of bedoel je dat de gebruiker nadat hij tabblad 'Decursus' heeft geopend een ander tabblad opent?

Misschien kun je een klein voorbeeldje van de data met de gewenste output tonen?

Oops! Google Chrome could not find www.rijks%20museum.nl


Acties:
  • 0 Henk 'm!

  • arnob
  • Registratie: Juli 2000
  • Niet online
voor (1), criteria > waarde, sorteren op en dan een TOP 1 meegeven
voor (2), de sql functie datepart werkt toch ook in Access? desnoods met datediff maar of dat efficient is weet ik niet.

Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 13:36
MarijnvdZaag schreef op donderdag 08 april 2010 @ 16:47:
ID is een autonummering, bovendien geven die nummers ook precies de volgorden aan waarin acties zijn gedaan. ID is dus uniek.

Als nog meer niet duidelijk is, hoor ik het graag.
Dat het een echte volgorde aangeeft is bij een auto increment niet zeker, sorteren op bijvoorbeeld een creation date wel.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

arnob schreef op donderdag 08 april 2010 @ 16:52:
voor (1), criteria > waarde, sorteren op en dan een TOP 1 meegeven
Dat gaat niet in een enkele query zonder subquery werken. Dit waarschijnlijk wel:
SQL:
1
SELECT TOP 1 * FROM tabel WHERE idVeld > (SELECT idVeld FROM tabel WHERE criterium)

Overigens vind ik het persoonlijk erg "gevaarlijk" om functioneel afhankelijk te zijn van de waardes van je ID's. ID's zijn voor identificatie, niet voor dit soort trucjes. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 17:58

Haan

dotnetter

djluc schreef op donderdag 08 april 2010 @ 17:02:
[...]
Dat het een echte volgorde aangeeft is bij een auto increment niet zeker, sorteren op bijvoorbeeld een creation date wel.
Inderdaad, als je ergens een record verwijdert, vult Access het gat gewoon op met het nieuwste record..

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Haan schreef op donderdag 08 april 2010 @ 17:10:
[...]

Inderdaad, als je ergens een record verwijdert, vult Access het gat gewoon op met het nieuwste record..
:? Weet je dat wel zeker? Kan me niet voorstellen dat Access dat doet.

Oops! Google Chrome could not find www.rijks%20museum.nl


Acties:
  • 0 Henk 'm!

  • arnob
  • Registratie: Juli 2000
  • Niet online
"Welk tabblad wordt het meest geopend na het tabblad 'Decursus'".
als je bedoeld 'behalve' kan je dan niet zeggen cat <> 'decursus'?
als je een lijst hebt en 'decursus' is je nulpunt oid dan wordt het moeilijker (en is het een aparte vraagstelling ;-)

Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 17:58

Haan

dotnetter

P_de_B schreef op donderdag 08 april 2010 @ 17:11:
[...]

:? Weet je dat wel zeker? Kan me niet voorstellen dat Access dat doet.
Het lijkt er op dat Access dat inderdaad niet doet.. Ik dacht dat ik dat weleens gezien had, maar daar zal ik me dan wel in vergist hebben. Het leek mij ook al vrij apart dat dat zo werkte.

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • N0stradamus
  • Registratie: April 2002
  • Laatst online: 19-07-2024
Volgens mij wil je toch in je resultaat geen records hebben die je niet wilt? Dus dan moet je je query aanpassen zodat dat 'eerste' record niet meekomt.

De volgende query geeft enkel de section_id's met een hogere telling dan die van 'eadCursus'

code:
1
2
3
4
SELECT Section_ID, Count(*)
FROM EPD
GROUP BY Section_ID
HAVING Count(*) > (SELECT Count(*) from EPD where section_id = 'eadDecursus')

Die kun je nog verfraaien met TOP en ORDERS naar wens en section_id variabel maken.

Als ik het echt allemaal van te voren wist...


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Hmm, die eerste vraag is nog wel een uitdaging die ik niet eerder heb gezien...
SQL:
1
2
3
4
5
6
7
8
9
SELECT secondTab.section_id, COUNT(*)
FROM EPD as firstTab inner join epd as secondTab on 
  firstTab.gebruiker_code=secondTab.gebruiker_code and firstTab.id<secondTab.id 
  left join epd as inBetweenTab on 
  firstTab.gebruiker_code=inBetweenTab.gebruiker_code and
  firstTab.id<inBetweenTab.id and inBetweenTab.id<secondTab.id
where inBetweenTab.id is null and firstTab.section_id = 'eadDecursus'
GROUP BY secondTab.section_id
ORDER BY COUNT(*) DESC

Hoewel je hier misschien datum_tijd wil gebruiken, en ook met een maximum-tussentijd wil werken.

Die 2e:
SQL:
1
2
3
4
5
select distinct patient1.gebruiker_code from epd as patient1 
  inner join epd as patient2 on
  patient1.gebruiker_code=patient2.gebruiker_code and
  patient1.patient_registratienummer<>patient2.patient_registratienummer and
  abs(datediff("n",patient1.datum_tijd,patient2.datum_tijd))<30

Hoewel dit misschien sneller moet/kan. Alles ongetest.
offtopic:
NL+EN=>verschrikking :p

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • MarijnvdZaag
  • Registratie: Juli 2004
  • Laatst online: 30-07 19:29
Ik merk dat niet iedereen mijn eerste vraag begreep, dus die heb ik verduidelijkt in de startpost.
En nog over het kijken naar de automatische ID's voor de volgorde: dat moet ik toch echt gebruiken denk ik, want datum/tijd is lang niet precies genoeg (slechts op een minuut).

De post van pedorus ziet er erg helpful uit, maar ik ben er nog niet in geslaagd de eerste werkend te maken. De tweede is erg traag en zo te zien niet compleet omdat het 'meer dan (twee)'-gedeelte even is weggelaten :| maar dat is wel een goeie start waar ik hopelijk toch nog wat mee kan :)

Meer tips, vooral voor het eerste probleem (zie aangepaste startpost dus), zijn natuurlijk welkom en verder bedankt voor al gedane moeite ;)

offtopic:
ja... ik hoop dat de programmatuur zelf consistenter is. helaas krijgen we die amper te zien :p

[ Voor 10% gewijzigd door MarijnvdZaag op 20-04-2010 05:44 ]


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Die left join op 2 verschillende tabellen lukt niet zo in Access denk ik. Even omschrijven naar iets dat Access wel snapt anders. Zeg:
SQL:
1
2
3
4
5
6
7
8
9
SELECT secondTab.section_id, Count(*)
FROM EPD AS firstTab INNER JOIN epd AS secondTab ON 
    (firstTab.id<secondTab.id) AND (firstTab.gebruiker_code=secondTab.gebruiker_code)
WHERE firstTab.section_id = 'eadDecursus'  and not exists (
    select * from epd as inBetweenTab where 
        firstTab.gebruiker_code=inBetweenTab.gebruiker_code and 
        firstTab.id<inBetweenTab.id and inBetweenTab.id<secondTab.id)
GROUP BY secondTab.section_id
ORDER BY Count(*) DESC;

Ik heb geen idee over de performance hiervan in Access. Desnoods kun je altijd nog met vba gewoon door de hele tabel lopen over de table-key, maar dat is een hele andere aanpak. :p

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten

Pagina: 1