簡體   English   中英

如何訂購 sql 中不同字符串的計數

[英]How to order count of distinct strings in sql

所以我有一個看起來像這樣的表:

ID           timestamp                  USER_TYPE
osdfbouwefo  2021-03-04 15:58:02.271    unidentified
ieqiofbeoww  2021-03-04 19:58:53.125    GroupA
fbruwbfewef  2021-03-04 20:59:02.273    GroupA
oewfbewfuff  2021-03-05 04:34:12.512    GroupB
hmithneregn  2021-03-05 15:43:22.271    GroupA
v_eifb3r39f  2021-03-06 03:58:54.231    unidentified
ieqiofbeoww  2021-03-06 12:21:34.211    GroupA
fbruwbfewef  2021-03-06 18:56:44.121    GroupA

我需要創建的是 USER_TYPE 的唯一用戶的運行記錄。 也就是說,用戶第一次出現在桌子上時,將被計算為當天,並且不再計算在內。 此外,它需要按USER_TYPE細分,我期望的是按 DATE 為每個新用戶 ID 記帳的分組表,隨着每個 USER_TYPE 的日期增加而增加計數。

最終結果:

DATE           USER_TYPE USE_COUNT
2021-03-04  unidentified         1
2021-03-04        GroupA         2
2021-03-05        GroupB         1
2021-03-05        GroupA         3
2021-03-06  unidentified         2

因此,如果您只查看一個 USER_TYPE,它會根據最后一次計數而增加。 2021-03-04 中有一個unidentified ,因此在2021-03-04中表示為 1。 下一次以不同 ID 出現的unidentified是在2021-03-06使其第二次出現,因此這是 2。所有 USER_TYPE 也是如此,它們總是添加到自己身上。

請注意,原始表中的最后兩個條目不包括在內,因為這些 ID 已經出現

這是我嘗試過的,但這不完全是,我希望這是可能的!!!

    SELECT
        DISTINCT DATE(TIMESTAMP) AS "DATE",
        USER_TYPE,
        COUNT(ID) OVER (
            PARTITION BY USER_TYPE
            ORDER BY
                DATE(TIMESTAMP) ASC
        ) AS USE_COUNT
    FROM
        table
    ORDER BY
        DATE(TIMESTAMP) ASC

我認為這會起作用:

SELECT DATE(timestamp) DATE,USER_TYPE, 
       ROW_NUMBER() OVER (PARTITION BY USER_TYPE ORDER BY timestamp) USE_COUNT FROM
 (SELECT ID,timestamp,user_type, 
         ROW_NUMBER() OVER (PARTITION BY id ORDER BY timestamp) rnum
 FROM mytable) A
 WHERE rnum=1
 ORDER BY DATE(timestamp) ASC, USER_TYPE DESC;

這個想法是首先分配按ID分區的ROW_NUMBER()並按timestamp排序。 然后把它變成一個子查詢。 在外部查詢中,執行另一個ROW_NUMBER()但這次按USER_TYPE進行分區,其排序與子查詢中的相同。 根據您的示例數據,結果應返回如下:

日期 用戶類型 USE_COUNT
2021-03-04 身份不明 1
2021-03-04 A組 1
2021-03-04 A組 2
2021-03-05 B組 1
2021-03-05 A組 3
2021-03-06 身份不明 2

這是一個小提琴: https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=3fe5824ea1010d33777a005041d31bda

接受的答案甚至不接近您的預期結果集。

您需要找到每個用戶的最早日期,要么

FROM
 (
   SELECT
      ID
     ,timestamp
     ,user_type
     ,MIN(timestamp)
      OVER (PARTITION BY id) AS min_ts
   FROM mytable
 ) AS dt
WHERE timestamp = min_ts

或者

FROM
 (
   SELECT
      ID
     ,timestamp
     ,user_type
     ,ROW_NUMBER() -- min timestamp gets lowest rownum 1
      OVER (PARTITION BY id
            ORDER BY timestamp) AS rn
   FROM mytable
 ) AS dt
WHERE rn=1

然后計算每天的唯一用戶數並計算累積總和:

SELECT
   CAST(timestamp AS DATE) AS DATE
  ,USER_TYPE
  ,SUM(COUNT(*)) -- cumulative sum over count
       OVER (PARTITION BY USER_TYPE
             ORDER BY CAST(timestamp AS DATE)) AS USE_COUNT 
FROM
 (
   SELECT
      ID
     ,timestamp
     ,user_type
     ,ROW_NUMBER()
      OVER (PARTITION BY id
            ORDER BY timestamp) AS rn
   FROM mytable
 ) AS dt
WHERE rn=1
GROUP BY CAST(timestamp AS DATE), USER_TYPE
ORDER BY DATE, USER_TYPE
;

小提琴

嗯。 . . 我想你想要一個累積和 window function 聚合:

select date(timestamp), user_type,
       sum(count(*)) over (partition by user_type order by date(timestamp)) as running_count
from t
group by date(timestamp), user_type;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM