如何从 SQL 中包含多个列的报表中的列中选择最近的项目?
Posted
技术标签:
【中文标题】如何从 SQL 中包含多个列的报表中的列中选择最近的项目?【英文标题】:How can I select the most recent item from a column in a report with several columns in SQL? 【发布时间】:2021-10-22 08:07:05 【问题描述】:我有一份包含几列的报告,其中之一是“cmets”。我只需要显示该客户下所有评论中的最新评论。我也有创建评论的日期字段。如何才能最好地做到这一点?
【问题讨论】:
这能回答你的问题吗? Implement paging (skip / take) functionality with this query 我不想按那一栏排序。我只想将最近的评论作为每行显示的唯一评论。很抱歉没有更好地解释这一点。有些案例有多个 cmets,而不是重复行多次,每个新评论一个,只需要为该行显示最近的评论,而忽略其余的。 您如何确定最近的评论是什么? 如果您分享一小部分数据样本和预期结果(可能显示您现在得到什么以及需要改变什么),答案可能很简单。我明白你想要什么,但如果没有看到数据的结构,很难给出明确的答案。 【参考方案1】:select TOP 1 * from report order by comment_time desc
其中“report”是表的名称,“comment_time”是评论的创建时间。
Select TOP 1
将消除所有其他行并仅返回第一行(这将是您的最新评论)
最好将“comment_time”的数据类型更改为 datetime 以改善结果。仅使用日期将无法对同一天创建的那些 cmet 进行排序
【讨论】:
他需要报告中每个客户的最后一条评论。【参考方案2】:有几种方法可以做到这一点,但我的选择是在数据集查询中添加一列,为每一行提供所需的评论。然后在报告中,我们只隐藏它的第一个副本以外的所有内容。
通过一个简单的例子来工作。我们有两个客户,“Dave”和“Bob”,他们有一些数字和日期。每条记录也有评论。
我们可以使用子查询来获取每个客户的最后一条评论,并将其附加到其他列,像这样......
这里我只是模拟了表@t
中的一些数据,然后查询得到想要的结果。
DECLARE @t TABLE (client varchar(20), iVal int, sComment varchar(20), dtEntrySeq datetime)
INSERT INTO @t VALUES
('Dave', 5, '1st Dave comment', '2021-01-15 09:00:00'),
('Dave', 15, '2nd Dave comment', '2021-01-29 09:00:00'),
('Dave', 25, '3rd Dave comment', '2021-01-29 09:30:00'),
('Bob', 35, '1st Bob comment', '2021-01-01 09:00:00'),
('Bob', 45, '2nd Bob comment', '2021-01-02 09:00:00'),
('Bob', 55, '3rd Bob comment', '2021-01-03 09:00:00'),
('Bob', 65, '4th Bob comment', '2021-01-04 09:00:00'),
('Bob', 75, '5th Bob comment', '2021-01-06 09:00:00')
SELECT
a.*, lc.sComment as LastComment
FROM @t a
JOIN (
SELECT * FROM
(SELECT *, ROW_NUMBER() OVER(PARTITION BY client ORDER BY dtEntrySeq desc) as RowN FROM @t) r
WHERE r.RowN = 1
) lc on a.client = lc.client
这给了我们以下输出...
我们真的不需要日期和原始评论列,但为了清楚起见,我把它们留了下来。
现在是报告。
创建一个新报表,使用上面的 SQL 作为数据集查询。
接下来添加一个表格并将所需的列拖到表格控件中。创建一个按客户端分组的行组。
现在单击包含“最后一条评论”的文本框,然后在属性窗口中,将HideDuplicates
属性更改为行组的名称,在本例中它将被称为“客户端”。如果您在此处不使用行组,那么如果 Bob 和 Dave 的最后一个 cmets 相同,它将隐藏整个数据集的除第一个 cmets 之外的所有 cmets,而不是在每个客户端上重置。
这是正在构建的报告的快速 GIF 以及要演示的最终输出。
【讨论】:
以上是关于如何从 SQL 中包含多个列的报表中的列中选择最近的项目?的主要内容,如果未能解决你的问题,请参考以下文章