【问题标题】:Get last 5 records from each ID without using LIMIT不使用 LIMIT 从每个 ID 获取最后 5 条记录
【发布时间】:2017-01-29 23:15:47
【问题描述】:

我在 Excel VBA 中使用以下 SQL 代码从 PostGreSQL 导入数据:

Const sqlconnection = "Provider=visoledb;"

Dim conn As New Connection
conn.ConnectionString = sqlconnection
conn.Open
Dim rs As Recordset

Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = "FR"
Sheets("FR").Select
Range("A1").Select

DIm fr As String
    fr = "SELECT master_id, eventdate, num_result " _
    & "FROM fr INNER JOIN person p ON fr.master_id=p.entity_id AND p.auditflag=1 " _
    & "WHERE fr.auditflag=1 AND num_result IS NOT NULL AND num_result <> 0 " _
    & "ORDER BY master_id "  

Set rs = conn.Execute(fr)
With ActiveSheet.QueryTables.Add(Connection:=rs, Destination:=Range("A1"))
    .Refresh
End With

rs.Close

它为我提供了表中每个人的所有记录值。

我被告知我不能使用LIMIT,所以我该如何限制它只显示每个人的最后 5 条记录。

【问题讨论】:

  • 哪一列用于对记录进行排序?

标签: sql postgresql excel vba


【解决方案1】:

使用row_number():

SELECT master_id, eventdate, num_result 
FROM fr INNER JOIN
     (SELECT p.*,
             ROW_NUMBER() OVER (PARTITION BY p.entity_id ORDER BY ?? DESC) as seqnum
      FROM person p
     ) p
     ON fr.master_id = p.entity_id AND p.auditflag = 1 AND seqnum <= 5
WHERE fr.auditflag = 1 AND num_result IS NOT NULL AND
      num_result <> 0
ORDER BY master_id;

我不知道您如何定义“最后 5 个”。指定它的列就是?? 所指的内容。

【讨论】:

    【解决方案2】:

    假设一对多连接的标准化数据库具有不同的 Persons 具有多个 fr 记录,并且需要 显示每个人的最后 5 条记录 表示时间元素,因此建议使用 fr.eventdate 字段,请考虑 Postgres 的 ROW_NUMBER() 窗口函数。

    具体来说,这个ROW_NUMBER() 计算由外键f.masterid(即每个人的ID)按降序排列的eventdate 分组的记录顺序。有了这样的排名,您就可以在外部查询的 WHEREON 子句中筛选前 5 名:

    SELECT t.master_id, t.eventdate, t.num_result
    FROM 
        (
         SELECT fr.master_id, fr.eventdate, fr.num_result, 
                ROW_NUMBER() OVER (PARTITION BY fr.master_id ORDER BY fr.eventdate DESC) AS rnk
         FROM fr
         WHERE fr.auditflag=1 AND fr.num_result <> 0 AND fr.num_result IS NOT NULL
        ) As t
    
    INNER JOIN person p
       ON t.master_id = p.entity_id AND p.auditflag=1 
    WHERE t.rnk <= 5
    ORDER BY master_id, t.eventdate;
    

    【讨论】:

      猜你喜欢
      • 2020-10-01
      • 2022-10-01
      • 2020-04-09
      • 2022-10-14
      • 2022-11-17
      • 2020-11-24
      • 2019-08-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多