gpt4 book ai didi

sql - 需要计算列中的重复项,并在SQL中将具有某些条件的项分开

转载 作者:行者123 更新时间:2023-12-01 11:13:17 25 4
gpt4 key购买 nike

我是 ORACLE SQL 世界的新手。我试图找出一种方法来计算如下内容。

假设我在表“A”中有以下可用数据。
Status 是由不同的逻辑产生的,为了简单起见,我以 Status 为例。

Name               Status
---------------------------
John N
John Y
Smith N
Karrie Y
Walter N
Smith Y
Walter N
John N
Walter N
Karrie Y

现在,我想输出如下内容:
Name                Status               Flag
-----------------------------------------------
John N S
John Y S
John N S
Smith N S
Smith Y S
Karrie Y Y
Karrie Y Y
Walter N N
Walter N N
Walter N N

这只是一个示例数据和一个示例输出。

基本上,让我们以约翰为例:
  • 如果有 3 个可用的约翰,有多个“N”和至少一个“Y”,那么我希望标志为“S”。
  • 如果有 3 个 John's 可用,有多个 'N's 和 'Y',那么我希望标志为 'N'。
  • 如果有 3 个约翰可用,则有多个“Y”和 'N',那么我希望标志为 'Y'。

  • 我通过添加额外的列作为 count* 来尝试这个,它按 对表进行分区。姓名 , 并计算其中的所有名称。
    最终会告诉我“那里可以有多少个‘Y’和‘N’!”。

    但是,即使我计算了所有这些名称,我也无法区分出“Y”和“N”。

    不知道如何通过纯 SQL 实现这一点。

    我知道
    If COUNT('N') = COUNT('John') then 
    flag = 'N'
    else if COUNT('N') < COUNT('John') then
    flag = 'S'
    else flag = 'Y'.

    这是我试过的:
    SELECT a.NAME
    , a.status
    , COUNT(NAME) OVER (PARTITION BY NAME ORDER BY NAME) COUNT
    FROM A a;

    我被困在这之后。

    你能帮我一下吗?

    这是我的预期输出:
    Name                Status               Flag

    -----------------------------------------------
    John N S
    John Y S
    John N S
    Smith N S
    Smith Y S
    Karrie Y Y
    Karrie Y Y
    Walter N N
    Walter N N
    Walter N N

    最佳答案

    在这种情况下,你可以不用计算,只需使用 max()min() :

    select t.*,
    (case when max(status) over (partition by name) = min(status) over (partition by name)
    then status
    else 'S'
    end) as flag
    from t;

    这实现了以下逻辑:
  • 如果名称的状态相同,则分配该状态。
  • 否则,分配 'S' .

  • 这个逻辑是表达条件的一种更简单的方式。

    Here是一个db<> fiddle 。

    我不确定按指定顺序获取行是否是问题的一部分如果是这样,您可以添加:
    order by (case when flag = 'S' then 1 when flag = 'Y' then 2 else 3 end),
    name

    关于sql - 需要计算列中的重复项,并在SQL中将具有某些条件的项分开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56920780/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com