2013-06-03 3 views
1

Мне нужно выбрать строки из таблицы, где существует только одна строка с этим идентификатором.SQL застрял с этим

Таблица примеров с двумя колонками.
ID первая и временная метка.
так первая строка ID 1, Отметка 01/01/2013

ID  Timestamp 
1  01/01/2013 
2  02/02/2013 
3  04/02/2013 
3  07/02/2013 
4  20/03/2013 

Таким образом, для этой таблицы, я хотел бы только вернуть записи с идентификатором 1,2,4, поскольку они все имеют только 1 строку ,

Мне тогда нужно только возвращать эти строки, если у них есть метка времени более месяца назад. Временная метка находится в этом формате 2012-11-12-22.00.15.541231

Может ли кто-нибудь помочь?

+0

, какую базу данных вы используете? – ankurtr

+0

Тег 'isqlquery' предлагает SQL Server – beny23

+0

Какой тип столбца' Timestamp'? – beny23

ответ

3

Это должно работать для вас:

SELECT * 
FROM mytable 
WHERE id NOT IN (
    SELECT id 
    FROM mytable 
    GROUP BY id 
    HAVING COUNT(*) > 1 
) AND time_created < current_timestamp - 1 month 
+0

** 'Имея счетчик (*) = 1' ** – Luv

+0

@Luv Я думаю, что вам не хватает предложение' NOT IN'. , в котором вам не нужно использовать 'count (*)> 1' для желаемого вывода. –

+0

Нет, '> 1' когда' NOT IN' используется. Это будет '= 1', когда' IN' используется – mvp

0

вы можете использовать group by условие для этого выхода -

Edit

добавление Condition на колонке DATESTAMP

SELECT * 
    FROM Your_Table_Name 
WHERE Id IN 
     (SELECT Id FROM Your_Table_Name GROUP BY Id HAVING COUNT(*) = 1) 
AND time_created < current_timestamp - 1 month 
0

Что-то вроде этого должно работать.

select id 
from yourtable 
where timestampfield <= current timestamp - 1 month 
group by id 
having count(*) = 1 

минус 1 месяц часть из here.

+0

Вероятно, сначала проверьте счет, а условие даты после – Andomar

0

SQL Fiddle

MySQL Setup 5.5.30 Схема:

CREATE TABLE Table1 
    (`ID` int, `Timestamp` date) 
; 

INSERT INTO Table1 
    (`ID`, `Timestamp`) 
VALUES 
    (1, '2013-01-01'), 
    (2, '2013-02-02'), 
    (3, '2013-04-02'), 
    (3, '2013-07-02'), 
    (4, '2013-03-20') 
; 

Запрос 1:

select ID,Timestamp 
from Table1 
where DATEDIFF(curdate(),DATE_SUB(Timestamp,INTERVAL 1 MONTH))>=1 
group by ID 
having count(ID)=1 

Results:

| ID |      TIMESTAMP | 
---------------------------------------- 
| 1 | January, 01 2013 00:00:00+0000 | 
| 2 | February, 02 2013 00:00:00+0000 | 
| 4 | March, 20 2013 00:00:00+0000 | 
+0

этот вопрос не имеет ничего общего с MySQL – mvp

+0

@mvp: просто хотел показать подход. Это распространено для всех баз данных, которые я думаю, и когда я посмотрел на проблему, для базы данных не было тега, поэтому я считал mysql. – ankurtr

0

Если вам нужно только вернуть идентификаторы и метки времени, вы можете избежать использования подзапроса, идя, как это:

SELECT ID, MAX(Timestamp) AS Timestamp 
FROM atable 
GROUP BY ID 
HAVING COUNT(*) = 1 
    AND MAX(Timestamp) < CURRENT TIMESTAMP - 1 MONTH 
;