首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在sql中编写一个查询,执行excel/sheets的"=COUNTIF(B2:B4,">"&B2)“?

如何在sql中编写一个查询,执行excel/sheets的"=COUNTIF(B2:B4,">"&B2)“?
EN

Stack Overflow用户
提问于 2022-10-25 14:55:05
回答 3查看 69关注 0票数 0

我试图在sql中执行"=COUNTIF( B1 :B3,">"& B1 )“,它计算列中元素的数量,从B1行到B3,它们比B1大。我们每3行就这么做一次。

假设我们有B列

532.02

667.96

588.1

579.35

623.98

621.29

现在,我们需要计算每三行的元素数,它们比元素B(i)大。

532.02 -> 2 (=COUNTIF( B1 : B3,">"&B1) (从B1到B3的元素数大于B1)

667.96 -> 0 (=COUNTIF( B2 : B3,">"&B2) (从B2到B3的元素数大于B2)

588.1 -> 0 (=COUNTIF( B3 : B3,“>”& B3) (从B3到B3的元素数大于B3)

579.35 -> 2 (=COUNTIF( B4 : B6,">"&B4) (从B4到B6的元素数大于B4)

623.98 -> 0 (=COUNTIF( B5 : B6,">"&B5) (从B5到B6的元素数大于B5)

621.29 -> 0 (=COUNTIF( B6 : B6,">"&B6) (从B6到B6的元素数大于B6)

因此,在sheets/excel中,我们使用这个(=COUNTIF(B5:B6,">"&B5),但是在此基础上如何在sql中写入查询呢?

EN

回答 3

Stack Overflow用户

发布于 2022-10-25 16:00:30

您可以将函数与具有3 (3、6、9等)间隔的新列一起使用。

然后,您可以构建公式以获得interval列的值,并继续使用您所拥有的公式。

所以,要建立的公式应该是:

(=COUNTIF(B5:"B"&=CELL("contents",H33),">"&B5)

在本例中,H33具有间隔。

票数 1
EN

Stack Overflow用户

发布于 2022-10-25 16:12:55

首先,如果您希望有不同的行为取决于记录的位置(3组),那么您必须有某种方式来显示该位置,除非您指定了SQL数据的特定顺序。您可能需要为递增的每一行添加一个唯一的ID。例如:

代码语言:javascript
复制
CREATE TABLE MY_TABLE
(
  ROW_N NUMBER,
  AMMOUNT NUMBER
);
INSERT INTO MY_TABLE VALUES (1,532.02);
INSERT INTO MY_TABLE VALUES (2,667.96);
INSERT INTO MY_TABLE VALUES (3,588.1);
INSERT INTO MY_TABLE VALUES (4,579.35);
INSERT INTO MY_TABLE VALUES (5,623.98);
INSERT INTO MY_TABLE VALUES (6,621.29);

然后,您可以使用模函数来更改行为,具体取决于您所使用的行是否有一个可以被3、1的余数或其余的2完全整除的引用。

为了比较同一表上不同记录之间的值,您可能需要使用一个自联接。在这种情况下,有时需要执行两次,因此需要两个自联接。

我提出的方法是使用case语句,这对于进行几次比较是可以的,但实际上并不是可伸缩的。

我最后使用了联合,只是为了将数据返回到原来的格式。

代码语言:javascript
复制
WITH calcs
     AS (SELECT a.row_n   AS rown_a,
                a.ammount AS ammount_a,
                0         AS gtr_a,
                b.row_n   AS rown_b,
                b.ammount AS ammount_b,
                CASE
                  WHEN b.ammount < a.ammount THEN 1
                  ELSE 0
                END       AS gtr_b,
                c.row_n   AS rown_c,
                c.ammount AS ammount_c,
                CASE
                  WHEN c.ammount > a.ammount
                       AND c.ammount < b.ammount THEN 1
                  WHEN c.ammount < a.ammount
                       AND c.ammount > b.ammount THEN 1
                  WHEN c.ammount < a.ammount
                       AND c.ammount < b.ammount THEN 2
                  ELSE 0
                END       AS gtr_c
         FROM   my_table a,
                my_table b,
                my_table c
         WHERE  MOD(a.row_n, 3) = 0
                AND b.row_n = a.row_n - 1
                AND c.row_n = a.row_n - 2)
SELECT *
FROM   (SELECT rown_a,
               ammount_a,
               gtr_a
        FROM   calcs
        UNION
        SELECT rown_b,
               ammount_b,
               gtr_b
        FROM   calcs
        UNION
        SELECT rown_c,
               ammount_c,
               gtr_c
        FROM   calcs) x
ORDER  BY 1 

这个查询有点混乱,但是您试图在SQL中做的是一些奇怪的IMHO。

票数 1
EN

Stack Overflow用户

发布于 2022-10-26 07:30:21

我只是想加点东西。也许这个查询可以为您添加一些值,例如在不使用联接的情况下对下面的行执行操作。

代码语言:javascript
复制
SELECT
    ROW#,
    B_column first#,
    SUM(B_column) OVER (order by ROW# rows between 1 following and 1 following) second#,
    SUM(B_column) OVER (order by ROW# rows between 2 following and 2 following) third#
FROM (  
    SELECT 
        row_number() over (order by (select NULL)) ROW#,
        B_column
    FROM [your_schema].[your_table]
) A 

谢谢

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74196055

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档