मुझे यकीन है कि कोई इंगित करेगा कि यह एक मूल पुनर्वसन समस्या है, लेकिन मुझे लगता है कि मैं Googling पर गरीब हूं, इसलिए मैं अपने सवाल को स्टैक ओवरफ्लो के देवताओं के लिए पेश कर रहा हूं।
मेरी समस्या यह है कि मैं संख्या की गणना करना चाहता हूंदो तिथियों (रैंक 1 और 2 के बीच) के दिन जो एक ही कॉलम से आते हैं लेकिन दूसरे कॉलम (रैंक) में अलग-अलग मान होते हैं। यहां डेटासेट स्कीमा का एक उदाहरण दिया गया है:
User Date Rank
Bob 2016-12-01 3
Bob 2016-12-07 2
Bob 2016-12-10 1
मुझे यह क्या चाहिए:
User Date1 Date2 DaysBetween
Bob 2016-12-07 2016-12-10 3
आदर्श रूप से, मैं इसे झांकी में करना चाहता था, लेकिन SQL / BigQuery ठीक है, भी।
उत्तर:
उत्तर № 1 के लिए 1नीचे आज़माएं
WITH YourTable AS (
SELECT "Bob" AS User, DATE "2016-12-01" AS Date, 3 AS Rank UNION ALL
SELECT "Bob" AS User, DATE "2016-12-07" AS Date, 2 AS Rank UNION ALL
SELECT "Bob" AS User, DATE "2016-12-10" AS Date, 1 AS Rank
)
SELECT
User,
MAX(CASE WHEN Rank = 2 THEN Date END) AS Date1,
MAX(CASE WHEN Rank = 1 THEN Date END) AS Date2,
DATE_DIFF(MAX(CASE WHEN Rank = 1 THEN Date END),
MAX(CASE WHEN Rank = 2 THEN Date END), DAY) AS DaysBetween
FROM YourTable
GROUP BY User
नोट - यह BigQuery में है मानक एसक्यूएल
उत्तर № 2 के लिए 1
एक अन्य विकल्प
WITH YourTable AS (
SELECT "Bob" AS User, DATE "2016-12-01" AS Date, 3 AS Rank UNION ALL
SELECT "Bob" AS User, DATE "2016-12-07" AS Date, 2 AS Rank UNION ALL
SELECT "Bob" AS User, DATE "2016-12-10" AS Date, 1 AS Rank
)
SELECT
User, Date1, Date2,
DATE_DIFF(Date2, Date1, DAY) AS DaysBetween
FROM (
SELECT
User, Rank, Date as Date2,
LEAD(Date) OVER(PARTITION BY User ORDER BY Date DESC) AS Date1
FROM YourTable
)
WHERE Rank = 1