![](/img/trans.png)
[英]SQL Query : should return Single Record if Search Condition met, otherwise return Multiple Records
[英]SQL query returning a column of 1 if a condition is met and 0 otherwise
我創建了一個不錯的查詢,以觀察進入我站點的所有唯一IP。 該架構如下:
Page_Statistic-包含每個頁面命中的數據(每個命中一個記錄)。
Ip_Location_Info-包含每個訪問者的位置數據(每個ip一個記錄)。
我想獲得所有唯一的IP地址,以及位置,訪問次數,時間范圍以及他們是否在我的網站上嘗試了該演示-這是我遇到的麻煩。 如果他們嘗試過演示,我想要1,如果沒有嘗試,我想要0。 IP已嘗試演示,前提是在Page_Statistic中存在標簽設置為“ demo”的tupple。
我創建了以下查詢來解決此問題:
WITH uniqueips(frst, lst, ip, visits) AS
(
SELECT MIN(requested_on), MAX(requested_on), ip, count(*) AS visits
FROM Page_Statistic p
GROUP BY ip
),
tried_demo(ip, tried_demo) AS
(
SELECT DISTINCT ip.ip, ISNULL(p.page_statistic_id - p.page_statistic_id + 1, 0)
FROM uniqueips ip
LEFT JOIN Page_Statistic p ON p.ip = ip.ip AND p.tag = 'demo'
)
SELECT
i.*, ip.frst AS first_appeared_on,
ip.lst AS last_appeared_on,
ip.visits,
d.tried_demo
FROM Ip_Location_Info i
JOIN uniqueips ip ON ip.ip = i.ip
JOIN tried_demo d ON ip.ip = d.ip
ORDER BY ip.frst
但是丑陋的地方是我為try_demo設置了1或0。
ISNULL(p.page_statistic_id - p.page_statistic_id + 1, 0)
之所以有效,是因為如果p.page_statistic_id為null,則將1加到null上就等於null,因此isull將返回參數列表(0)中的第二項。 真是個駭客! 正確的方法是什么?
擁有它的方式很好用,但是如果要更改它,可以將其更改為
case when p.page_statistic_id is null then 0 else 1 end
要么
將您的try_demo CTE更改為此
tried_demo(ip, tried_demo) AS
(
SELECT DISTINCT p.ip, cast(1 as bit)
FROM Page_Statistic
WHERE p.tag = 'demo'
)
那么您的選擇可以像這樣
SELECT
i.*, ip.frst AS first_appeared_on,
ip.lst AS last_appeared_on,
ip.visits,
coalesce(d.tried_demo,0) as tried_demo
FROM Ip_Location_Info i
JOIN uniqueips ip ON ip.ip = i.ip
LEFT JOIN tried_demo d ON ip.ip = d.ip
ORDER BY ip.frst
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.