2

このデータセットの使用:

| RECID |  ID  | VALUE1 | VALUE2 | VALUE3 |                          RECDT |
----------------------------------------------------------------------------
|     1 | 1-01 |      1 |      2 |      3 | January, 01 2013 00:00:00+0000 |
|     2 | 1-01 |      3 | (null) | (null) | January, 02 2013 00:00:00+0000 |
|     3 | 1-01 | (null) | (null) |      1 | January, 03 2013 00:00:00+0000 |

簡単なクエリで次の結果を返すことは可能ですか?

|  ID  | VALUE1 | VALUE2 | VALUE3 |
-----------------------------------
| 1-01 |      3 |      2 |      1 | 


データセットは、日付と PtID に基づいて各列の最新の値を返す必要があります。たとえば、2013 年 1 月 2 日までの PTID に対するすべての変更に関心がある場合、結果は次のようになります。

|  ID  | VALUE1 | VALUE2 | VALUE3 |
-----------------------------------
| 1-01 |      3 |      2 |      3 |


スキーマは、興味のある人のためにsqlfiddleで開始されています。

4

2 に答える 2

2

SQL の多くの方言で機能するアプローチを次に示します。

select ptid,
       (select value1 from t t2 where t2.ptid = t.ptid and value1 is not null order by recdt desc limit 1
       ) as Value1,
       (select value2 from t t2 where t2.ptid = t.ptid and value2 is not null order by recdt desc limit 1
       ) as Value2,
       (select value3 from t t2 where t2.ptid = t.ptid and value3 is not null order by recdt desc limit 1
       ) as Value3
from t
where ptid = '1-01'
group by ptid

データベースによっては、の代わりにtopまたはが好まれる場合があります。recnum = 1limit

MySQL では、次のこともできます。

select ptid,
       substring_index(group_concat(value1 order by recdt desc), ',', 1) as Value1,
       substring_index(group_concat(value2 order by recdt desc), ',', 1) as Value2,
       substring_index(group_concat(value3 order by recdt desc), ',', 1) as Value3
from t
group by ptid

これには、値を文字列に変換するという副作用があります。目的のタイプにキャストバックできます。また、値にコンマが含まれている可能性がある場合は、別の区切り記号を使用する必要があります。

于 2013-03-07T16:18:01.507 に答える
0

これは、サブクエリを使用せずに 1 行の出力のみを生成する SQL の多くの方言で機能するアプローチです。

SELECT f1.value1,f3.value2,f5.value3 FROM FUNTIMES f1 
LEFT JOIN funtimes f2 ON
f1.recdt<f2.recdt AND f2.value1 IS NOT NULL
JOIN funtimes f3 ON f1.ptid=f3.ptid
LEFT JOIN funtimes f4 ON
f3.recdt<f4.recdt AND f4.value2 IS NOT NULL
JOIN funtimes f5 ON f1.ptid=f5.ptid
LEFT JOIN funtimes f6 ON
f5.recdt<f6.recdt AND f6.value3 IS NOT NULL
WHERE f1.value1 IS NOT NULL AND f2.value1 IS NULL
AND f3.value2 IS NOT NULL AND f4.value2 IS NULL
AND f5.value3 IS NOT NULL AND f6.value3 IS NULL;

上記のものと比較してください: http://www.sqlfiddle.com/#!2/9ee9a/34

于 2013-03-07T16:46:17.083 に答える