2017-08-25 53 views
1

我有一張表,其結構已簡化爲下面的小表。操作SQL表

我想操縱下面的數據集爲以下形式:

新的數據集將包含DC的每一種情況下單記錄,與是/否標誌,指示,如果NatureOfTumour從DC更改爲以及如果適用,從DC更改爲IN所需的時間。

只有當位置保持不變時,纔會考慮從DC到IN的更改,即只有在NatureOfTumour從DC更改爲IN且位置保持不變的情況下,才應考慮那些記錄。 ItemNo是唯一的ID。

在社區成員的建議下,我也在下面的文本中粘貼了表格,並儘可能清理乾淨。最後一列「Gen」是空的。 ItemNo是唯一的ID。將下面的文本複製到excel並執行文本到列(以空格分隔)應該以可讀格式爲您提供原始表格。抱歉想不到更好的方法來粘貼表格。

ItemNo DateOfTest NatureOfTumour  Location  Centre  Gen 
2345  07/2006  DC     P   S-224 
2345  12/2006  IN     P   S-224 
2342  05/2004  DC     Q   B-266 
3878  06/2006  DC     P   S-224 
3878  05/2005  DC     Q   S-224 
5678  09/2000  IN     P   S-224 
5597  10/2001  DC     P   B-266 
5597  01/1999  IN     Q   B-266 
+1

MySQL或Oracle?另外,請不要張貼截圖,以文字形式提供信息。 –

+0

我在MySQL上做了類似的事情。我添加了2個表格。第一個是原始數據。第二個是相同的,但有一個編輯日期。在哪裏可以跟蹤每個唯一ID的變化以及我想知道日期的任何字段。關係是'1到多個'。我在SO上發佈了這個問題。讓我找到它。 – droidnation

+1

對不起,傢伙們仍然習慣於在這裏發佈問題的最佳方式。我已經將圖像(表格)更改爲簡單的文本,應該很容易複製到Excel中,並將文本轉換爲文本到 – Jayden

回答

0

您需要自行加入。沿着這些路線的東西:

SELECT 
    d.ItemNo, 
    i.DateOfTest - d.DateOfTest AS datediff, 
    d.Location, 
    d.Centre, 
    d.Gen 
FROM 
(
    SELECT 
     * 
    FROM demo 
    WHERE NatureOfTumour = 'DC' 
) d 
INNER JOIN 
(
    SELECT 
     * 
    FROM demo 
    WHERE NatureOfTumour = 'IN' 
) i ON d.ItemNo = i.ItemNo 
     AND d.Location = i.Location; 
+0

在Oracle中沒有'datediff' –

+0

@a_horse_with_no_name對不起 - 我開始寫時,它有MySQL標誌。我會刪除 –

+0

非常感謝喬納森。該代碼在mysql中看起來更簡單。由於我只能從我的工作系統運行代碼,因此我今天無法嘗試運行該代碼;但只是出於好奇,對於ItemNo = 2345這是唯一一個能滿足所有條件的ItemNo的輸出嗎?再次感謝你的幫助。 – Jayden

0

如果我明白你的問題,你可以試試這個: 讓我知道。 如果只想輸出更改的行(GEN ='Y'),請將LEFT JOIN更改爲INNER JOIN。

SELECT A.ITEMNO, A.DATEOFTEST, A.NATUREOFTUMOUR, A.LOCATION 
, CASE WHEN B.NATUREOFTUMOUR='IN' AND A.LOCATION = B.LOCATION THEN 'Y' ELSE 'N' END AS GEN_NEW 
, CASE WHEN B.NATUREOFTUMOUR='IN' AND A.LOCATION = B.LOCATION THEN B.DATEOFTEST-A.DATEOFTEST END AS TIME_PASS  
FROM TE A 
LEFT JOIN TE B ON A.ITEMNO=B.ITEMNO AND B.NATUREOFTUMOUR<>'DC' AND A.DATEOFTEST < B.DATEOFTEST 
WHERE A.NATUREOFTUMOUR='DC 

OR(我無法從你的問題理解)

SELECT A.ITEMNO, A.DATEOFTEST, A.NATUREOFTUMOUR, A.LOCATION 
, CASE WHEN B.NATUREOFTUMOUR='IN' THEN 'Y' ELSE 'N' END AS GEN_NEW 
, CASE WHEN B.NATUREOFTUMOUR='IN' THEN B.DATEOFTEST-A.DATEOFTEST END AS TIME_PASS 
FROM TE A 
LEFT JOIN TE B ON A.ITEMNO=B.ITEMNO AND B.NATUREOFTUMOUR<>'DC' AND A.DATEOFTEST < B.DATEOFTEST AND A.LOCATION = B.LOCATION 
WHERE A.NATUREOFTUMOUR='DC'\\ 

輸出

ITEMNO DATEOFTEST NATUREOFTUMOUR LOCATION GEN_NEW TIME_PASS 
1 2345 01.07.2006 DC    P   Y 153 
2 2342 01.06.2006 DC    Q   N NULL 
3 5597 01.10.2001 DC    P   N NULL 
4 3878 01.05.2005 DC    Q   N NULL 
5 3878 01.06.2006 DC    P   N NULL 
+0

不,我認爲他的結果只會是「natureOfTumor」從DC變爲IN並且位置保持不變(在那種情況下它仍然是「P」)的唯一ID「2345」的行。 – droidnation

+0

嗨Etsa。非常感謝您的回覆。 droidnation是正確的。輸出只應該是2345,因爲那是滿足所有約束條件的唯一項號 – Jayden

+0

這樣做真的很容易(正如我在答案中解釋的或使用Where條件)。 – etsa

1

試試這個。 LEAD函數根據DateOfTest排序的ItemNo組查看下一行。

WITH abc AS (
SELECT 
ItemNo 
,DateOfTest 
,NatureOfTumour 
,Location 
,Centre 
,LEAD(NatureOfTumour) OVER (PARTITION BY ItemNo ORDER BY DateOfTest) as FutureNature 
,LEAD(Location) OVER (PARTITION BY ItemNo ORDER BY DateOfTest) as FutureLocation 
,LEAD(DateOfTest) OVER (PARTITION BY ItemNo ORDER BY DateOfTest) as FutureDateOfTest 
FROM test_results 
) 

SELECT 
    ItemNo 
    ,DateOfTest 
    ,NatureOfTumour 
    ,CASE 
    WHEN FutureNature = 'IN' 
     AND FutureLocation = Location 
    THEN 'Yes' 
    ELSE 'NO' 
    END AS State_Change 
    ,FutureDateOfTest - DateOfTest as Date_Diff 
    ,Location 
    ,Centre 
from abc 
WHERE NatureOfTumour = 'DC' 
+0

這就是他想要的,我猜。我正在關注帖子。有趣。 – droidnation

+0

但你應該知道的IDs – droidnation

+0

不會對ItemNo進行分區,消除對ID的擔心? – natec