2013-06-26 2 views
0

У меня есть огромная история таблицы, где каждая таблица с «действиями» приходят войтиПолучить по идентификатору последней истории элемента

IdReg 
IdTypeReg 
State_prev 
Action 
State_new 
Timestamp 

И я не могу думать о запросе, который говорит:

  • Получить список IdRegs
  • где IdTypeReg является @type (с последним State_new по Timestamp<@Date)
  • И который ПОСЛЕДНИЙ State_new NOT IN («Foo», «бар»)

Это означает, что если последний регистр по истории таблицы для каждого идентификатора в «Foo» или «бар» это reg не будет отображаться.

Я имею в виду ... Я делал это раньше, но я не могу вспомнить, как это сделать.

Я могу сказать, что никакие курсоры не разрешены, ни временные таблицы, ни слишком много подвыборок.

@EDIT: Разъяснение например

Скажем, по 01 января 2013 У меня есть мой последний RegID журнал с 'бессрочными'

Если я помещаю '02 января 2013 'по параметру @date it не должен отображать reg id 000123, было ли это в состоянии «Работа» вкл.

Заканчивается до @date, поэтому я не хочу этого в моем списке.

ответ

2

Вы можете использовать row_number(), чтобы сделать это

WITH cte as (
SELECT 
    IdReg, 
    IdTypeReg, 
    State_prev, 
    Action, 
    State_new, 
    Timestamp, 
    ROW_NUMBER() OVER (PARTITION BY IdReg ORDER BY timestamp desc) rn 
FROM 
    actions 
WHERE 
    Timestamp<@Date 

) 
SELECT 
    * 
FROM 
    Cte 
WHERE RN = 1 
    and  State_new NOT IN ('foo','bar') 
+0

Я видел что-то подобное раньше ... кажется, это будет трюк ... позвольте мне попробовать! – apacay

+0

Нет, если «foo» является последним, он все еще приносит его. Фильтр временной метки не будет делать то, что мне нужно. – apacay

+0

hmm У меня возникли проблемы с тем, почему это произошло, возможно, вы могли бы поделиться некоторыми данными примера, где это происходит –

0

Я сделал это ... но мне не нравится это

SELECT DISTINCT t.id 
     , h1.timestamp 
     , h1.old_state 
     , h1.new_state 

FROM  
myTable t 
JOIN history h1 ON (h1.dbid = t.dbid) 
JOIN statedef s on t.state = s.id 
JOIN (SELECT haux.dbid id, date = MAX(haux.timestamp) 
      FROM cvuser.history haux 
      WHERE haux.timestamp < @date 
      GROUP BY haux.dbid 
     ) h2 ON (h2.date = h1.timestamp) 
where h1.new_state NOT IN ('ThisOne','ThatOne','TheOther') 
ORDER BY t.id desc 

Можно ли улучшить это немного?

+0

Мне тоже это не нравится. Зачем вступать в annef, если он не используется. Вы действительно хотите присоединиться к h2 только по дате. И имена столбцов не соответствуют этому вопросу. – Paparazzi

+0

Извините, что я удалил некоторую информацию ... в Select Distinct у меня есть s.name .., и если я присоединяюсь только к дате, он приносит только последний рег (1 рег), а не список необходимых мне регистров. – apacay