Molto complesso Raggruppa per / Unique / Limite da SQL-comando
Domanda
Io in realtà non so nemmeno come chiamare questo: P, ma ...
Ho una tabella, chiamiamolo "uploads"
id owner date
-----------------------------
0 foo 20100101120000
1 bar 20100101120300
2 foo 20100101120400
3 bar 20100101120600
.. .. ..
6 foo 20100101120800
Ora, quando Se mai fare qualcosa di simile:
SELECT id FROM uploads ORDER BY date DESC
Questo si tradurrebbe in:
id owner date
-----------------------------
6 foo 20100101120800
.. .. ..
3 bar 20100101120600
2 foo 20100101120400
1 bar 20100101120300
0 foo 20100101120000
Domanda: Nizza, ma, voglio andare oltre. Perché ora, quando si sarebbe costruire una timeline (e l'ho fatto: P), si sono 'spam' da messaggi che dicono foo e bar caricato qualcosa. Se mai come di raggrupparli e restituire il primo risultato con un termine di '500' alla data-campo.
Che tipo di SQL-comando ho bisogno che si tradurrebbe in:
id owner date
-----------------------------
6 foo 20100101120800
3 bar 20100101120600
0 foo 20100101120000
Poi, dopo di che, posso effettuare una chiamata per ogni record per ottenere i record associativi in ??un lasso di tempo di 5 minuti (questo è un exmaple per id = 6):
SELECT id FROM uploads WHERE date>=20100101120800-500 ORDER BY date DESC
Qualcuno ora come devo fare il primo passo? (Limitando così / raggruppando i risultati)
(btw. So che quando voglio utilizzare questo, dovrei convertire ogni data (YmdHis = 60) per Unix-tempo (= 100), ma non ho bisogno di 5 minuti per essere esattamente 5 minuti, possono essere un minuto in meno a volte ...)
Soluzione
Non sono abbastanza chiaro del risultato che si sta cercando di ottenere, anche con i vostri esempi. Forse qualcosa con arrotondamento e il raggruppamento.
SELECT max(id) max_id,owner, (ROUND(date/500)*500) date_interval, max(date) date
FROM uploads GROUP BY date_interval,owner
Si consiglia di utilizzare a pavimento oa soffitto, invece di TONDO, a seconda di ciò che si desidera.
Altri suggerimenti
standard SQL non tratta con intervalli molto bene. Avete intenzione di bisogno di fare un auto-join della tabella per confrontare le date di diverse tuple. In questo modo, si può facilmente trovare tutte le coppie di tuple delle quali sono le date non più di 500 pezzi. Tuttavia, si vuole veramente a raggrupparsi le date in insiemi non più di 500 pezzi - e che non può essere espresso in SQL a tutti, per quanto ne so
.Che cosa si può fare è qualcosa di molto simile: dividere l'intervallo di tempo totale in intervalli da 500 unità fisse, e poi raggruppare tutte le tuple nella tabella in base all'intervallo sono in Per questo, è necessario prima un tavolo o. risultato della query con gli orari di inizio degli intervalli; questo può essere creato utilizzando una query SQL sul tavolo e una funzione che sia "arrotonda" un timestamp al tempo di partenza nel suo intervallo, o calcola il numero di sequenza intervallo. Poi in una seconda fase si può unire la tabella con quel risultato a raggruppare i suoi timestamp in base al loro corrispondente tempo di inizio. Non posso dare il codice SQL perché è DBMS-dipendente, e certamente non si può dire se questo è il modo migliore di realizzare ciò che si desidera nella vostra situazione.
Usa un vista in linea? per esempio. qualcosa come
SELECT u1.*
FROM uploads u1,
(SELECT date
FROM uploads u2
WHERE u2.owner='foo') datum_points
WHERE u1.date BETWEEN datum_points.date
AND DATE_ADD(datum_points.date INTERVAL 5 MINUTES)
dovrebbe restituire tutti i post pubblicati entro 5 minuti di 'foo' fare un post.