2013-06-25 7 views
0

У меня есть таблица с полями RecordId (уникальный), createdate, AID, Bid, ИДСSQL показать количество повторяющихся записей

Есть также три таблицы определения для значений, хранящаяся в полях Aid, Bid, ИДС

Я хотел бы сгенерировать набор результатов, который отображает все поля из таблицы, а также еще один столбец, показывающий количество повторяющихся записей с одинаковым идентификатором, бидом и идентификатором cID, созданным за последние 10 минут.

Примечание: набор результатов должен включать в себя определения для AID, Bid и CID, используя внутренние соединения трех таблиц определения, например

RecordID, createdate, AID, aIDdefinition, Bid, bIDdefinition, CID, cIDdefinition, [ количество дополнительных записей, созданных за последние 10 минут с одинаковыми идентификаторами, bID и cID]

Наконец, запрос выбора должен содержать только верхние записи X, но поиск дубликатов должен быть во всей таблице.

ответ

0

Под «последние 10 минут», я предполагаю, что вы имеете в виду относительно текущей даты/времени, а не относительно текущей записи. Этот подход использует объединение и агрегирование, чтобы получить результат:

select t.aId, t.bId, t.cId, tsum.cnt 
from t join 
    (select aId, bId, cId, count(*) as cnt 
     from t 
     where createTime <= CURREENT_TIMESTAMP 
     group by aId, bId, cId 
    ) tsum 
    on t.aId = tsum.aId and t.bId = tsum.bId and t.cid = tsum.cId; 

Обратите внимание, что выражение для текущей даты/времени изменяется между базами данных; CURREENT_TIMESTAMP - стандартный метод ANSI. Вы также можете использовать getdate() (SQL Server), now() (MySQL и Postgres), sysdate (Oracle) или что-то еще.

Определения будут дополнительными объединениями, но вы даже не называете имена таблиц.

+0

'current_timestamp' будет эквивалент ANSI для 'getdate()' –

+0

@a_horse_with_no_name. , , Спасибо. Я исправил ответ. –

+0

Одна вещь, которую я забыл, выбор должен принести только верхние записи X, но поиск дубликатов должен быть во всей таблице. – user1480192

0

Я считаю, что это будет чем-л, как этот

SELECT t1.recordid, t1.createdate, t1.aID, t1.bID, t1.cID, isnull(tcount.numberOfRecords10min,0), definitionTable1.aIDdefinition 
    FROM t1 
    LEFT OUTER JOIN (
     SELECT aID,bID,cID,count(*) as numberOfRecords10min 
     FROM t1 
     WHERE createdate >= dateadd(minute, -10, GETDATE()) 
     GROUP BY aID,bID,cID 
    ) tcount on (t1.aID = tcount.aID and t1.bID = tcount.bID and t1.cID = tcount.bID) 
    LEFT OUTER JOIN definitionTable1 on t1.aID = definitionTable1.aID 

в предположении, что таблица со списком записей называется t1 и таблица с определениями для AID является definitionTable1

код для SQL Server, в случае, если вы используете другую СУБД, вам нужно будет заменить dateadd(minute, -10, GETDATE()) на получение отметки времени за 10 минут до этого момента и isnull(tcount.numberOfRecords10min,0) для устранения нулей (заменяются 0)