我正在处理一张桌子,就像这样:

Name Status Date
Alfred 1 Jan 1 2023
Alfred 2 Jan 2 2023
Alfred 3 Jan 2 2023
Alfred 4 Jan 3 2023
Bob 1 Jan 1 2023
Bob 3 Jan 2 2023
Carl 1 Jan 5 2023
Dan 1 Jan 8 2023
Dan 2 Jan 9 2023

我正在try 设置一个查询,以便可以处理以下内容: 我想要每个名字的最新状态,

SELECT MAX(Date), Status, Name
FROM test_table
GROUP BY Status, Name

此外,我希望在相同的查询中,如果用户的状态为ever且状态为2,则能够拉入,而不管最近的状态是否为2

WITH has_2_table AS (
SELECT DISTINCT Name, TRUE as has_2
FROM test_table
WHERE Status = 2 )

然后可能会在名字上加入上面的左连接?

但是,将这些作为两个单独的查询并将它们连接在一起对我来说感觉很笨拙,特别是因为我想添加额外的列和其他判断.有没有更好的方法在一个单一的查询中设置它,或者这是最有效的方法?

推荐答案

您说"I'd like to add additional columns",所以我将其解释为您想要 Select 整个最新记录并添加-2\f25‘Ever-2’-2栏.

您可以通过联接两个查询或使用窗口函数来执行此操作.不知道snowflake云的数据,我不能告诉你哪个更高效.

Join 2 Queries

Select A.*,Coalesce(B.Ever2,"No") as Ever2
From (
    Select * From testable x
    Where date=(Select max(date) From test_table y
                Where x.name=y.name)
) A Left Outer Join (
    Select name,"Yes" as Ever2 From test_table
    Where status=2
    Group By name
) B On A.name=B.name

如果相关的子查询在您的平台上实现得不好,第一个子查询也可以编写为内部联接.

use of Window Functions

Select * From (
    Select row_number() Over (Partition by name, order by date desc, status desc) as bestrow,
    A.*,
    Coalesce(max(Case When status=2 Then "Yes" End) Over (Partition By name Rows Unbounded Preceding And Unbounded Following), "No") as Ever2
    From test_table A
)
Where bestrow=1

第二种查询类型总是读取整个TEST_TABLE并对其进行排序,因此它可能不是最高效的.

Sql相关问答推荐

在SQL:2003(PGQ)中,Cypher查询语言、GQL、PGQL和属性图查询的常见子集是什么?'

GROUP BY和GROUP_CONCAT用于计算比赛排名

使用占位符向SQL INSERT查询添加 case

更新PostgreSQL 15中的JSON值

如何根据计数和分组获取订单总数

如何根据同一表中某一列中的值重新排列行(仅输出它们)(重新排序)?

根据Rails活动记录中时间戳/日期时间的时间部分从PostgreSQL中提取记录

根据时间、状态和相关行在PostgreSQL中的存在来删除行

查找滑动窗口框架中的最大和最小列值

在SQL中转换差异表的多列

在 Postgres 中将结果按几十年划分

我需要在 ASP.NET C# 中获取 2 个 SQL 查询结果的平均值

SQL根据另一列的顺序和值获取组中的最后一列

如何根据共同列值从两个表中包含列,但只包含左表中的行

Postgres如何在一个日历周中前进和回填值

PostgreSQL分割字符串为子词并判断其是否存在于其他字符串中

批量更改WooCommerce中所有产品的税收状态

如何刷新在视图之上创建的表

使用同一表中的数据或任何其他虚拟数据在 SQL 表中插入数据的最快方法

如何在 SQLite 中将列的两个或多个相等的连续值合并为一个?