如何从 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 中包含多个列的报表中的列中选择最近的项目?的主要内容,如果未能解决你的问题,请参考以下文章

SQL如何查询出某一列中不同值出现的次数?

SQL Select 语句获取字符串中包含一个或多个值的所有记录

列中的 Rowwise Mean 包含除最后一列之外的单词

根据列表中的数据框创建数据框,并在R中的列中包含最大值

在行中包含大图像时,如何使 IE 11 尊重表格中的列宽?

如何从结果集中打印值而没有列中的任何重复记录