sql >> Databasteknik >  >> RDS >> Mysql

Skillnad mellan datum i två på varandra följande rader

För PostgreSQL tror jag att du vill ha lag fönsterfunktion att jämföra raderna; det kommer att vara mycket effektivare än en självskarvning och filter. Detta kommer inte att fungera med MySQL, eftersom det fortfarande inte verkar stödja de vanliga SQL:2003-fönsterfunktionerna; se nedan.

För att bara hitta de två lägsta kan du använda dense_rank fönsterfunktion över ticketid , filtrera sedan resultaten för att endast returnera rader där dense_rank() = 2 , dvs rad med näst-från-lägsta tidsstämpel, där lag() kommer att producera raden med den lägsta tidsstämpeln.

Se denna SQLFiddle som visar exempel på DDL och utdata.

SELECT ticketid, extract(epoch from tdiff) FROM (
  SELECT
      ticketid,
      ticketdate - lag(ticketdate) OVER (PARTITION BY ticketid ORDER BY ticketdate) AS tdiff,
      dense_rank() OVER (PARTITION BY ticketid ORDER BY ticketdate) AS rank
  FROM Table1
  ORDER BY ticketid) x
WHERE rank = 2;

Jag har använt ticketdate som namn på datumkolumnen eftersom date är ett fruktansvärt namn för en kolumn (det är ett datatypnamn) och bör aldrig användas; det måste vara dubbla citattecken i många situationer för att fungera.

Det bärbara tillvägagångssättet är förmodligen det självanslutna som andra har postat. Fönsterfunktionsmetoden ovan fungerar förmodligen på Oracle också, men verkar inte göra det i MySQL. Såvitt jag kan ta reda på det stöder den inte SQL:2003-fönsterfunktionerna.

Schemadefinitionen fungerar med MySQL om du SET sql_mode = 'ANSI' och använd timestamp istället för timestamp with time zone . Det verkar som om fönsterfunktionerna inte gör det; MySQL stryper OVER klausul. Se denna SQLFiddle .



  1. Bash Script Loop Through MySQL

  2. MySQL:Fyll en tabell i en lagrad procedur effektivt

  3. Hur anger jag bokstavligt datum när jag skriver SQL-fråga från SQL Server som är länkad till Oracle?

  4. Hur man lämnar sammanfoga flera en till många tabeller i mysql?