SQL возвращает отдельные значения, затем фильтрует по дате - PullRequest
2 голосов
/ 27 марта 2019

Как я могу выбрать только строки вновь добавленных записей для конкретной даты, которые не были введены ранее?

Мои исходные данные:

All data

SELECT DISTINCT 
    Date, IP
FROM
    tblIPs
WHERE
    (Date = '2019-03-25')

Возвращает:

enter image description here

, но 10.0.0.1 уже существует в базе данных, поэтому я нея не хочу, чтобы это было в моих результатах.

Можно ли каким-либо образом выбрать уникальные IP-адреса независимо от даты, а затем отфильтровать их по дате, 2019-03-25?

Ответы [ 6 ]

7 голосов
/ 27 марта 2019

Вы можете использовать group by и having:

SELECT MIN(Date), IP
FROM tblIPs
GROUP BY IP
HAVING MIN(Date) = '2019-03-25'
3 голосов
/ 27 марта 2019

Таким образом, вы хотите, чтобы IP-адреса появлялись на 2019-03-25, а не появлялись до этого:

SELECT IP FROM tblIPs WHERE DATE = '2019-03-25'
EXCEPT
SELECT IP FROM tblIPs WHERE DATE < '2019-03-25'
;

Если вы также хотите исключить вновь появляющиеся IP-адресапосле 2019-03-25 измените < на <>

3 голосов
/ 27 марта 2019

Пожалуйста, попробуйте это.

SELECT 
    DISTINCT A.Date, A.IP
FROM        
   tblIPs A
   INNER JOIN tblIPs B
   ON A.IP <> B.IP
   AND A.DATE <> B.DATE
WHERE     
   (A.Date = '2019-03-25')
1 голос
/ 27 марта 2019

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

SELECT ips.*
FROM tblIPs ips
WHERE EXISTS (SELECT 1 FROM tblIPs ips1 WHERE ips1.IP = ips.IP AND ips.Date <> ips.Date);
1 голос
/ 27 марта 2019

Это будет работать для вашего сценария

SELECT T.DATE, T.IP
FROM tblIPs as T
INNER JOIN (
    SELECT count(id) as count, IP FROM tblIPs
    GROUP BY ip
    HAVING COUNT(id) = 1
) AS A
ON (T.IP = A.IP)
WHERE DATE = '2019-03-25'
1 голос
/ 27 марта 2019
SELECT * FROM (SELECT Date, IP, row_number() over (partition by IP order by date desc)as recno
FROM         tblIPs ) TT
WHERE     (Date = '2019-03-25') and recno = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...