Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Impala/SQL期间获得不同值的计数?_Sql_Impala - Fatal编程技术网

如何在Impala/SQL期间获得不同值的计数?

如何在Impala/SQL期间获得不同值的计数?,sql,impala,Sql,Impala,我有一个原始表,记录在特定时间段内来到商店的客户ID。使用Impala,我想计算每天来商店的不同客户ID的数量。e、 到目前为止,在第3天,有5位不同的客户访问过 下面是我拥有的原始表的一个简单示例: Day ID 1 1234 1 5631 1 1234 2 1234 2 4456 2 5631 3 3482 3 3452 3 1234 3 5631 3 1234 以下是我想要得到的: Day

我有一个原始表,记录在特定时间段内来到商店的客户ID。使用Impala,我想计算每天来商店的不同客户ID的数量。e、 到目前为止,在第3天,有5位不同的客户访问过

下面是我拥有的原始表的一个简单示例:

 Day    ID
 1    1234
 1    5631
 1    1234
 2    1234
 2    4456
 2    5631
 3    3482
 3    3452
 3    1234
 3    5631
 3    1234
以下是我想要得到的:

 Day    Count(distinct ID) until that day
 1        2
 2        3
 3        5
有没有一种方法可以在一个查询中轻松做到这一点?

试试这个:

 select day, count(distinct(id)) from yourtable group by day

无法100%确定是否会对黑斑羚有效

但是如果你有一张桌子的话。或者,如果您有一种在黑斑羚上动态创建派生表的方法

CREATE TABLE days ("DayC" int);

INSERT INTO days
    ("DayC")
VALUES  (1), (2), (3);

您可以使用此查询

在Postgresql中

SELECT "DayC", COUNT(DISTINCT "ID")
FROM sales
cross JOIN days 
WHERE "Day" <= "DayC"
GROUP BY "DayC"

这将只给出每天不同ID的计数。从第1天开始,我需要计算不同ID的数量。Impala不允许您从Group By语句之外的列中进行选择。这是荒谬的…例如,在第3天,到目前为止访问了5位不同的客户id代表客户对吗?你怎么能说当1234在第3天访问了两次时,5位不同的客户访问了该商店。你期望的结果并没有真正按照你想说的去做。从第一天开始到第三天,您只需计算客户1234一次。我一直在寻找countdistinct ID,直到第3天,第2天的计数应该是1。对于第3天,计数应该是2。这就是为什么我说你的预期结果不符合你想要说的。不,第2天的计数意味着直到第2天的不同ID的计数,包括第2天-即:1234561314456-三个ID…抱歉,如果这有误导性。。我想我得到了下面的答案。谢谢你的提问
SELECT "DayC", COUNT(DISTINCT "ID")
FROM sales
cross JOIN days 
WHERE "Day" <= "DayC"
GROUP BY "DayC"
| DayC | count |
|------|-------|
|    1 |     2 |
|    2 |     3 |
|    3 |     5 |
SELECT T."DayC", COUNT(DISTINCT "ID")
FROM sales
cross JOIN (SELECT DISTINCT "Day" as "DayC" FROM sales) T
WHERE "Day" <= T."DayC"
GROUP BY T."DayC"