2013-04-11 2 views
0

Смешения, но вот ситуация:Выберите первое появление элемента в последней группировке

Мы получили порядковые номера, которые соответствуют, когда программа находится в 1-минутных интервалах.

Sequence# | Timestamp 
    1  | 2012-04-11 12:00:00 
    2  | 2012-04-11 12:01:00 
    2  | 2012-04-11 12:02:00 
    2  | 2012-04-11 12:03:00 
    3  | 2012-04-11 12:04:00 
    5  | 2012-04-11 12:05:00 
    5  | 2012-04-11 12:06:00 
    6  | 2012-04-11 12:07:00 
    1  | 2012-04-11 12:08:00 
    2  | 2012-04-11 12:09:00 
    2  | 2012-04-11 12:10:00 
    2  | 2012-04-11 12:11:00 
    3  | 2012-04-11 12:12:00 

Продолжительность последовательности может изменяться, но интервал всегда один и тот же (каждые 1 минуту точно).

Как вы можете видеть, последовательности повторяются. Как я могу найти последнее, начавшееся событие of Seqence n?

Так что, если я хотел искать последовательности 2, я хотел бы вернуться 2 | 2012-04-11 12:09:00, потому что он является последним, начиная вхождение последовательности 2.

+0

Где данные? В базе данных? Или это читается из потока? –

+0

@PhilipKearns: Учитывая, что вопрос помечен [mysql] ... –

+0

Да, контекст здесь важен. Что вы пытаетесь сделать точно? – doliver

ответ

4

Try:

SELECT t1.* FROM `table_name` t1 
LEFT JOIN `table_name` t2 
on t1.`Sequence` = t2.`Sequence` and 
    t1.`Timestamp` = t2.`Timestamp` + interval 1 minute 
WHERE t1.`Sequence`=2 and t2.`Sequence` is null 
ORDER BY t1.`Timestamp` DESC LIMIT 1 

SQLFiddle here.

+0

Не думаю, что я следую тому, как это работает. Не будет ли это вернуть самое первое появление последовательности 2 в порядке времени? Ваше второе требование «ON» никогда не будет истинным, поэтому в левом соединении всегда будет t2.Sequence как null, поэтому каждое обнаружение последовательности Sequence 2 удовлетворяет этому запросу, и оно вернет последнее. Мой запрос более сложный, чем это, поэтому попробовать этот метод нелегко, поэтому мне нужно знать, какой метод действительно происходит здесь. – StuckAtWork

+0

+1, он работает. Но если бы вы могли объяснить, как это работает.? Моя фактическая база данных (глупо) хранит временную метку как «год», «месяц», «день» ...поля, а не по выбору, поэтому мне нужно знать, какая логика здесь происходит, чтобы воспроизвести его с этими полями. – StuckAtWork

+0

@StuckAtWork: второе условие 'on' всегда будет истинным, за исключением самой первой записи - привязывает текущую временную метку к предыдущей, минутой назад. Сочетание этого с первым условием «on» связывает текущую запись с последней записью **, если ** они являются одной и той же последовательностью - это означает, что левое соединение с условием «null» на внешней объединенной таблице фактически одинаково как «не существует» (внешнее соединение/нуль, где комбинация должна лучше работать в MySQL). –

0

Я думаю, что это то, что вы хотите ...

SELECT * FROM `table_name` WHERE `Sequence`=2 ORDER BY `Timestamp` DESC LIMIT 1 
+0

Этот запрос выводит '2 | 2012-04-11 12: 11: 00', а не '2 | 2012-04-11 12: 09: 00', как вы заявили, но я думаю '2 | 2012-04-11 12: 11: 00' на самом деле то, что вы искали –

+0

Я не думаю, что это - «последнее, ** начало ** появления» (мой акцент). –

+0

Nope; ищет '12: 09: 00'. Нам даны два параметра: 'startSeq' и' endSeq'. Мне нужна информация, которая формирует эти строки с начала 'startSeq' до конца' endSeq', поэтому мне понадобится более ранняя (но все же самая последняя группировка) последовательности 2, если 'startSeq' -' 2'. – StuckAtWork

0

Это то, что вы хотите?

$desired_sequence=2; 

$query="SELECT * FROM `table_name` ORDER BY `Timestamp` DESC"; 
$result = mysql_query($query); 
if (mysql_errno()) { die("ERROR ".mysql_errno($link) . ": " . mysql_error($link)); } 

$found_desired=0; 
while($row = mysql_fetch_array($result)) 
{ 
    if($row['Sequence']==$desired_sequence) 
    { 
     $found_desired=1; 
     $timestamp=$row['Timestamp']; 
    } 

    if(($found_desired==1) && ($row['Sequence']!=$desired_sequence)) 
    { 
     return; // End the while loop because $timestamp will have your desired output. 
    } 
} 
+0

Этот метод будет работать, я уверен, но это не так элегантно или так быстро, как хотелось бы. База данных хранит около 1 миллиона записей с несколькими тысячами уникальных порядковых номеров, поэтому я боюсь, что это может оказать серьезное влияние на производительность при запросе нескольких уникальных строк. – StuckAtWork

+0

Дайте мне знать, если вы найдете лучший способ ... Мне интересно узнать. –

+0

Я полагаю, если бы вы могли добавить 'WHERE' к первоначальному запросу и только результаты запроса после определенного времени, в течение которого вы положили последовательность, начатую после. Это значительно сократило бы возвращенные записи. Возможно, даже с учетом периода времени. Чем больше информации вы предоставляете, тем эффективнее будет. –

0

Я не уверен, что вы здесь. Я написал код, который будет работать, если данные находятся в текстовом файле. Если данные находятся в базе данных, было бы проще. Тем не менее, я предполагал, что в вашем примере у вас есть | разделяя данные, которых нет в базе данных.

function findLastOccurenceOfSequence ($sequenceNumber) 
{ 
    if (@!is_int ($sequenceNumber)) 
     throw new Exception ("Expected param1 to be an integer"); 
    $data = file_get_contents ("testFile.txt"); 
    $dataArray = explode ("\n", $data); 
    $dataArray = array_reverse ($dataArray); 
    $returnLine = ""; 
    $sequenceStarted = false; 
    foreach ($dataArray as $key => &$dataLine) 
    { 
     $pieces = explode ("|", $dataLine); 
     if (count ($pieces) != 2) 
      continue; 
     list ($thisSequenceNum, $timeStamp) = $pieces; 
     $thisSequenceNum = intval (trim ($thisSequenceNum)); 
     if ($thisSequenceNum == $sequenceNumber) 
     { 
      $sequenceStarted = true; 
      $returnLine = $dataLine; 
     } 
     else if ($sequenceStarted) 
     { 
      break; 
     } 
    } 

    if ($key == count ($dataArray)) 
    { 
     throw new Exception ("Sequence not found!"); 
    } 

    return $returnLine; 
} 

echo "OCCURRENCE: " . findLastOccurenceOfSequence (2); 
Смежные вопросы