我有這張表(table_2),它基本上提供了患者資訊和他們在特定日期訪問的部門 -
| 患者 ID | 部 | service_dte | 出生日期 | 數數 |
|---|---|---|---|---|
| 12345 | 心臟 | 1/2/21 | 78 年 6 月 18 日 | 5 |
| 12345 | 心臟 | 8/20/21 | 78 年 6 月 18 日 | 5 |
| 12345 | 心臟 | 10/28/21 | 78 年 6 月 18 日 | 5 |
| 12345 | 正交 | 1/14/21 | 78 年 6 月 18 日 | 2 |
| 12345 | 正交 | 7/7/21 | 78 年 6 月 18 日 | 2 |
| 12345 | 心臟 | 8/20/21 | 78 年 6 月 18 日 | 5 |
| 12345 | 心臟 | 4/19/21 | 78 年 6 月 18 日 | 5 |
| 12345 | 婦產科 | 4/1/21 | 78 年 6 月 18 日 | 1 |
| 78645 | 神經 | 5/1/21 | 7/18/87 | 2 |
| 78645 | 神經 | 7/7/21 | 7/18/87 | 2 |
| 78645 | 進入 | 7/7/21 | 7/18/87 | 1 |
| 32423 | 胃 | 11/7/21 | 3/12/57 | 1 |
我希望我想要的輸出生成一個額外的列(最大),為每個“Patient_ID”提供最高重復的“部門”,同時保持所有列原樣,類似于下表 -
| 患者 ID | 部 | service_dte | 出生日期 | 數數 | 最大限度 |
|---|---|---|---|---|---|
| 12345 | 心臟 | 1/2/21 | 78 年 6 月 18 日 | 5 | 心臟 |
| 12345 | 心臟 | 8/20/21 | 78 年 6 月 18 日 | 5 | 心臟 |
| 12345 | 心臟 | 10/28/21 | 78 年 6 月 18 日 | 5 | 心臟 |
| 12345 | 正交 | 1/14/21 | 78 年 6 月 18 日 | 2 | 心臟 |
| 12345 | 正交 | 7/7/21 | 78 年 6 月 18 日 | 2 | 心臟 |
| 12345 | 心臟 | 8/20/21 | 78 年 6 月 18 日 | 5 | 心臟 |
| 12345 | 心臟 | 4/19/21 | 78 年 6 月 18 日 | 5 | 心臟 |
| 12345 | 婦產科 | 4/1/21 | 78 年 6 月 18 日 | 1 | 心臟 |
| 78645 | 神經 | 5/1/21 | 7/18/87 | 2 | 神經 |
| 78645 | 神經 | 7/7/21 | 7/18/87 | 2 | 神經 |
| 78645 | 進入 | 7/7/21 | 7/18/87 | 1 | 神經 |
| 32423 | 胃 | 11/7/21 | 3/12/57 | 1 | 胃 |
我試過下面的代碼;這為我提供了上表中患者就診的科室數量-
select *
, count(department) OVER (PARTITION BY patient_id, department) AS count
FROM table_1
但是,它并沒有為患者 12345 的最大列提供所需的值,該列應該是心臟。而不是心臟,我得到正畸。請協助。這是我正在嘗試的代碼 -
select *
, max(department) OVER (PARTITION BY patient_id) AS max
FROM table_2
請以最佳方式提供幫助,我可以獲得最大的列,并建議我做錯什么或可能做錯了什么。
謝謝你。
uj5u.com熱心網友回復:
FIRST_VALUE()在第二級聚合中也使用視窗函式:
SELECT *, FIRST_VALUE(department) OVER (PARTITION BY patient_id ORDER BY count DESC) AS max
FROM (
SELECT *, COUNT(*) OVER (PARTITION BY patient_id, department) AS count
FROM table_1
) t
請參閱演示。
uj5u.com熱心網友回復:
count(department) OVER (PARTITION BY patient_id, department)將針對結果中的每一行計算,只需計算與該行相同的患者和部門的記錄數(其中部門不為空,具體而言)。這不是你想要的。
max(department) OVER (PARTITION BY patient_id) AS max還將為結果中的每一行計算,只需找到與該行相同患者的科室名稱的最大值。這是該患者訪問的所有科室按字母順序排序時的最后一個科室(這是將 MAX() 函式應用于字符值的方式),這不是您想要的。
我們想要一個子查詢來回傳每個患者訪問最多的部門,這里是一個例子:
select
tbl1.*
, MostVisited.department as MostVisitedDepartment
from
table_1 tbl1
inner join
(-- Take only the most visited department for each patient
select *
from (-- rank departments by number of times
-- visited for each patient; highest visited gets 1
-- the result of a tie (the patient visited two departments the
-- same number of times) depends on how the rdbms executes it.
select
VisitCnt.*
, row_number() over (partition by VisitCnt.patient_id
order by VisitCnt.TimesVisited desc) as Seq
from (-- Count each department visited by each patient
select
patient_id, department, count(*) as TimesVisited
from table_1
group by patient_id, department
) VisitCnt
) VisitCntRnked
where VisitCntRnked.Seq=1
) MostVisited
on MostVisited.Patient_ID=tbl1.Patient_ID
至于“最佳”:這取決于您的意思:表大小、索引、表統計資訊、您的特定資料庫產品,以及,如果您想為整個(或大部分)運行此查詢表的人口,或只是一個小的子集。我們通常希望查詢優化器在執行查詢時考慮這些因素。有許多例外情況,但優化查詢需要的資訊遠多于此問題中可用的資訊。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/395488.html
上一篇:Magento2屬性影像多個
