@@ -505,3 +505,45 @@ def test_raw_sql_params_with_alias(con):
505
505
query_parameters = {cutoff : value }
506
506
result = con .raw_sql (f"SELECT @{ name } AS { name } " , params = query_parameters )
507
507
assert list (map (dict , result )) == [{name : value }]
508
+
509
+
510
+ @pytest .fixture (scope = "module" )
511
+ def tmp_table (con ):
512
+ data = pd .DataFrame (
513
+ {"foo" : [1 , 1 , 2 , 2 , 3 , 3 ], "bar" : ["a" , "b" , "a" , "a" , "b" , "b" ]}
514
+ )
515
+ name = gen_name ("test_window_with_count_distinct" )
516
+ test_table = con .create_table (name , data )
517
+ yield test_table
518
+ con .drop_table (name , force = True )
519
+
520
+
521
+ @pytest .mark .parametrize (
522
+ ("expr" , "query" ),
523
+ [
524
+ (
525
+ lambda t : t .group_by ("foo" ).mutate (bar = lambda t : t .bar .nunique ()),
526
+ "SELECT foo, COUNT(DISTINCT bar) OVER (PARTITION BY foo) AS bar FROM {}" .format ,
527
+ ),
528
+ (
529
+ lambda t : t .filter (
530
+ lambda t : t .bar .nunique ().over (ibis .window (group_by = "foo" )) > 1
531
+ ),
532
+ "SELECT * FROM {} QUALIFY COUNT(DISTINCT bar) OVER (PARTITION BY foo) > 1" .format ,
533
+ ),
534
+ ],
535
+ ids = ["project" , "qualify" ],
536
+ )
537
+ def test_window_with_count_distinct (tmp_table , expr , query ):
538
+ identifier = tmp_table .get_name ()
539
+ sql = query (identifier )
540
+ result = (
541
+ expr (tmp_table ).to_pandas ().sort_values (["foo" , "bar" ]).reset_index (drop = True )
542
+ )
543
+ expected = (
544
+ tmp_table .sql (sql )
545
+ .to_pandas ()
546
+ .sort_values (["foo" , "bar" ])
547
+ .reset_index (drop = True )
548
+ )
549
+ tm .assert_frame_equal (result , expected )
0 commit comments