2017-08-05 5 views
0

はスタックを検索していましたが、特定の回答が見つかりませんでした。私は病院で働き、日々の生活を楽にしたいと思っています。我々は、配置されたカテーテルからデータを収集し、患者を1日1回または時には1日2回訪問する。私はこの情報を保存するためにいくつかのPHPを書いた(SQL Server 2012)。 dbo.patientsテーブルが1つあります。別のIDを選択する方法は、完全な行を表示する?

|ID|PatientID|Station|Name |Catheter|Room|VisitDate|Visit 
----------------------------------------------------------------------------- 
|1 |123456789|ACHI |Muller|PDK  |12 |12.12.17 |all fine, nothing special 
|2 |123456789|ACHI |Muller|PDK  |12 |13.12.17 |catheter removed 
|3 |234567891|GYN |Meyer |PDK  |4 |04.07.17 |pain in the back, raised bolus 
|4 |123456789|ACHI |Muller|PDK  |12 |14.12.17 |no infection, dismiss 
|5 |234567891|GYN |Meyer |PDK  |4 |05.07.17 |still pain, raised up to 12 
|6 |234567891|GYN |Meyer |PDK  |4 |06.07.17 |non functional, removed 

IDはデータベースで自動増分され、フォームには入力されません。 PatientIDは病院で一意の値です。 他の列はすべて同じである可能性があります(たとえば、1日に10カテーテル、またはCatheter = PDKまたは2つの名前が同じか、同じ部屋を共有するなど)。 データベースには1日約20回のエントリーがあります。

私の目的は、現在カテーテルを持っている患者のリストを表示することです。したがって、すべての列が必要ですが、最新の訪問日のみが必要です。つまり、PatientIDは2回表示されません。与えられた例の出力は次のようになります。

|ID|PatientID|Station|Name |Catheter|Room|VisitDate|Visit 
----------------------------------------------------------------------------- 
|4 |123456789|ACHI |Muller|PDK  |12 |14.12.17 |no infection, dismiss 
|6 |234567891|GYN |Meyer |PDK  |4 |06.07.17 |non functional, removed 

私はすでにSELECT * FROM dbo.patientsを示す、PHPでテーブルを持っているが、私はこれを濾過し、私はなぜ知らない必要があります。私はSELECT DISTINCTを試しましたが、PatientIDをうまくフィルタリングしましたが、1つの列しか返さず、全体の行が必要です。 searchingstackoverflowを通じて

私は似た何かを見つけて、それを試してみた:

WITH t AS (
    SELECT ROW_NUMBER() OVER(
     PARTITION BY PatientID 
     ORDER BY VisitDate 
    ) AS rnum,* 
    FROM dbo.patients 
) 
SELECT * FROM t a WHERE rnum IN (
     SELECT MAX(rnum) FROM t 
     GROUP BY PatientID 
     HAVING t.PatientID=a.PatientID 
) 

それは動作しますが、誰もがalseあまり複雑なアイデアを持っているそのappropiate場合またはかどうかは知りません。彼が最新のエントリを表示する場合、追加、私は本当に得ることはありません。

ありがとうございます!

ディルク

答えて

1

あなたは以下のようにROW_NUMBER使用することができます。以下のように

Select * from (
    Select *, RowN = Row_number() over(partition by PatientId order by VisitDate desc) from yourtable) a 
    Where a.RowN = 1 

出力:

+----+-----------+---------+--------+----------+------+------------+-------------------------+ 
| Id | PatientId | Station | Name | Catheter | Room | VistitDate |   Visit   | 
+----+-----------+---------+--------+----------+------+------------+-------------------------+ 
| 4 | 123456789 | ACHI | Muller | PDK  | 12 | 2017-12-14 | no infection, dismiss | 
| 6 | 234567891 | GYN  | Meyer | PDK  | 4 | 2017-07-06 | non functional, removed | 
+----+-----------+---------+--------+----------+------+------------+-------------------------+ 
+0

Select top (1) with ties * from yourtable order by row_number() over(partition by Patientid order by VisitDate desc) 

他のアプローチは、あなたが外側のクエリでROW_NUMBERを使用することができます私は最初のアプローチを使ったkあなたはそんなに、それは動作します!しかし[名前]はどういう意味ですか?私はただそれを削除し、それはまだ動作します。 –

+0

あなたの名前の列 –

+0

はい、ただし、そのクエリの目的は何ですか?何が必要なの?私はそれを把握することはできません:)。どうもありがとうございます! –

関連する問題