2016-07-18 65 views
1

傳遞參數我想在一個選擇查詢比較同一列的兩個不同的值。 這是我的代碼,我只傳遞一個值(來自最近的選擇查詢)。你能幫我解決一下如何傳遞另一個查詢中的第二個值? 使其更清楚一點,我想在開始時間與結束時間= NULL(我們的用戶登錄到我們的網站,並沒有完成訂單所需的時間)與結束時間的開始時間比較!= NULL(用戶登錄和註冊訂單)。2個SELECT查詢到另一個選擇查詢

SELECT 
    notFinished, 
    finished, 
    DATEDIFF(notFinished, finished) as dateDifference, 
    emailAddress, 
    phone, 
    __key__.id 
FROM (
    SELECT 
    startTime AS finished 
    FROM 
    [datastore_dump.Orders] 
    WHERE 
    emailAddress IN (
    SELECT 
     emailAddress 
    FROM 
     [datastore_dump.Orders] 
    WHERE 
     endTime IS NULL) 
    AND endTime IS NOT NULL and emailAddress is not null), 
(
    SELECT 
    emailAddress, 
    phone, 
    __key__.id, 
    startTime AS notFinished 
    FROM 
    [datastore_dump.Orders] 
    WHERE 
    endTime IS NULL) 

謝謝!

回答

1

考慮以下邏輯:

SELECT 
    emailAddress, startTime, endTime, DATEDIFF(endTime, startTime) AS daysDifference 
FROM (
    SELECT 
    emailAddress, startTime, endTime, status, 
    LAG(status) OVER(PARTITION BY emailAddress ORDER BY startTime) AS prevStatus 
    FROM (
    SELECT 
     emailAddress, startTime, endTime, 
     IF(endTime IS NULL, "not-finished", "finished") AS status 
    FROM [datastore_dump.Orders] 
) 
) 
WHERE status = "finished" 
AND prevStatus = "not-finished" 

它的作用是:
1.資格每個記錄作爲finishednot-finished基於endTime的狀態 2.查找每個記錄前的狀態 - prevStatus
3.對於狀態完成和以前的狀態記錄未完成 - 計算DIFF

希望這是接近你問什麼

+0

非常感謝,你的回答非常有幫助。只有一件我仍然不明白的事情,我怎樣才能得到status = not_finished的startTime?我想知道用戶是否在當天晚些時候或幾天後完成購物。那就是爲什麼我想用endTime null的startTime和startTime的endTime不是null的日期差別。 – AnaHid

+0

在'IF(結束時間IS NULL,「不完成」,「完成」)作爲status' - 狀態設置爲'未finished'如果結束時間IS NULL按照它在你的問題 –

+0

如何定義的,我想我投上一票現在。它只是去1,對不對?感謝您的評論。 – AnaHid

0

使用WITH子句,此類型的邏輯更容易在standard SQL中表示(取消選中「顯示選項」下的「使用舊版SQL」框)。爲了讓您一開始,你可能會想是這樣的:

WITH CompletedOrders AS (
    SELECT 
    startTime AS finished 
    FROM 
    datastore_dump.Orders 
    WHERE 
    emailAddress IN (
    SELECT 
     emailAddress 
    FROM 
     datastore_dump.Orders 
    WHERE 
     endTime IS NULL) 
    AND endTime IS NOT NULL and emailAddress IS NOT NULL 
), IncompleteOrders AS (
    SELECT 
    emailAddress, 
    phone, 
    __key__.id, 
    startTime AS notFinished 
    FROM 
    datastore_dump.Orders 
    WHERE 
    endTime IS NULL) 
SELECT ... 

作爲工作的例子,你可以嘗試:

WITH Orders AS (
    SELECT '[email protected]' AS email, CURRENT_TIMESTAMP() AS time 
    UNION ALL SELECT '[email protected]' AS email, NULL AS time 
    UNION ALL SELECT 
    '[email protected]', 
    TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR) AS time), 
CompletedOrders AS (
    SELECT * FROM Orders WHERE time IS NOT NULL), 
IncompleteOrders AS (
    SELECT * FROM Orders WHERE time IS NULL) 
SELECT 
    (SELECT COUNT(*) FROM CompletedOrders) AS completed_count, 
    (SELECT COUNT(*) FROM IncompleteOrders) AS incomplete_count; 
+-----------------+------------------+ 
| completed_count | incomplete_count | 
+-----------------+------------------+ 
|    2 |    1 | 
+-----------------+------------------+ 
+0

謝謝你,這真的很有幫助! – AnaHid