我正在嘗試構建一個查詢,該查詢將列出具有最近90年內條目的表中的所有用戶ID天,但不在最近30天內。SQL查詢查找在過去30天內沒有記錄但在過去90天內有記錄的用戶
表的超簡化版本將有三個字段:RecordID(主鍵,自動遞增),UserID(外鍵)和RecordDate(時間戳)。
我知道如何在兩個查詢中做到這一點,但可以在一個查詢中完成嗎?它應該返回任何用戶的用戶名,但用戶的入口少於90天,但在過去30天內沒有條目。
我正在嘗試構建一個查詢,該查詢將列出具有最近90年內條目的表中的所有用戶ID天,但不在最近30天內。SQL查詢查找在過去30天內沒有記錄但在過去90天內有記錄的用戶
表的超簡化版本將有三個字段:RecordID(主鍵,自動遞增),UserID(外鍵)和RecordDate(時間戳)。
我知道如何在兩個查詢中做到這一點,但可以在一個查詢中完成嗎?它應該返回任何用戶的用戶名,但用戶的入口少於90天,但在過去30天內沒有條目。
select distinct(userid)
from thetable
where recorddate > DATE_SUB(now(), INTERVAL 90 DAY)
and userid not in
(
select userid
from thetable
where recorddate > DATE_SUB(now(), INTERVAL 30 DAY)
)
我不知道MySQL的好,所以用適當的方式進行檢查,如果日期是在過去x天
我假設一個用戶ID可以在表中多次,但你只希望他們返回一次。因此,「獨特」
下面的查詢應該做的工作:
SELECT UserID
FROM MyTable AS T1
WHERE
(SELECT MIN(DATEDIFF(NOW(),RecordDate))
FROM MyTable AS T2 -- Most recent entry must be more
WHERE T2.UserID=T1.UserId) BETWEEN 31 AND 90 -- than 30 days ago, but no more
-- than 90 days ago
我不認爲這個帳戶是「在過去30天內沒有發送任何記錄」,它只發現已經發送過去30-90個用戶 –
@Ben,I修改了查詢以將其餘條件考慮在內。我現在沒有訪問MySQL的權限,但是請稍等片刻。 –
這應該這樣做
SELECT DISTINCT UserID
FROM Table t1
WHERE RecordDate > DATE_SUB(NOW(), INTERVAL 90 DAY)
AND NOT EXISTS (
SELECT 1 FROM Table
WHERE RecordDate > DATE_SUB(NOW(), INTERVAL 30 DAY)
AND UserID = t1.UserID
)
SELECT UserID
FROM
(
SELECT UserID,
MIN(RecordDate) AS min_date,
MAX(RecordDate) AS max_date
FROM MyTable
GROUP BY UserID
)
WHERE max_date < AddDate(CURRENT_TIMESTAMP, INTERVAL -30 DAY)
AND min_date >= AddDate(CURRENT_TIMESTAMP, INTERVAL -90 DAY)
這接近,但不應該「和的recordId不「be」和userid不在「? –
我修正了語法和IN子句... – Curt