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 ...)

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top