有一个医院数据库,其admissions
表的模式如下:
patient_id INT
admission_date DATE
discharge_date DATE
diagnosis TEXT
room_id INT
doctor_id INT
insurance_id INT
以下是我试图查询的内容:
- 获取每天的入场总金额。
- 获取从前一日期更改的录取量。
我尝试了以下查询:
SELECT
admission_date,
count(admission_date) as adm_day,
count(admission_date) - count(admission_date - 1) AS admn_count_change // this count is not correct
FROM admissions
group by admission_date
**查询结果:**前两列的数据显示正确,最后一列显示不正确的数据,即所有行的值为0,这完全超出了我的理解范围。我不太会用SQL,请多多指教。
3条答案
按热度按时间r8uurelv1#
尝试以下查询
LAG()是SQL中的一个窗口函数,它提供对当前行之前的指定偏移值处的行的访问。这意味着在LAG()函数的帮助下,我们可以访问当前行上任何先前行的数据。
更多了解请参考这里:mysql window function和SQLshack
eqqqjvef2#
您可以使用
代码(Oracle语法):
knpiaxh13#
就我个人而言,我更喜欢在应用程序端(或者使用查询结果的任何地方)处理计算,因为我不喜欢引用另一行本身的查询。
但是一个可能的解决方案是使用子选择,其中日期用于连接。
由于没有标记DBMS,因此我使用PostgreSQL 15。除了连接的日期计算外,它应该可以用于大多数DBMS。
左连接是必要的,这样最新的日期仍然会出现(admission_count_change null)。
我希望这个查询在大表中的伸缩性不是很好。
db<>fiddle to try it out yourself