diff --git a/moto/dynamodb/models/table.py b/moto/dynamodb/models/table.py
--- a/moto/dynamodb/models/table.py
+++ b/moto/dynamodb/models/table.py
@@ -707,6 +707,24 @@ def query(
                 if isinstance(item, Item) and item.hash_key == hash_key
             ]
 
+        # SORT
+        if index_name:
+            if index_range_key:
+                # Convert to float if necessary to ensure proper ordering
+                def conv(x: DynamoType) -> Any:
+                    return float(x.value) if x.type == "N" else x.value
+
+                possible_results.sort(
+                    key=lambda item: conv(item.attrs[index_range_key["AttributeName"]])  # type: ignore
+                    if item.attrs.get(index_range_key["AttributeName"])  # type: ignore
+                    else None
+                )
+        else:
+            possible_results.sort(key=lambda item: item.range_key)  # type: ignore
+
+        if scan_index_forward is False:
+            possible_results.reverse()
+
         # FILTER
         results: List[Item] = []
         result_size = 0
@@ -763,24 +781,6 @@ def query(
                         result_size += result.size()
                 scanned_count += 1
 
-        # SORT
-        if index_name:
-            if index_range_key:
-                # Convert to float if necessary to ensure proper ordering
-                def conv(x: DynamoType) -> Any:
-                    return float(x.value) if x.type == "N" else x.value
-
-                results.sort(
-                    key=lambda item: conv(item.attrs[index_range_key["AttributeName"]])  # type: ignore
-                    if item.attrs.get(index_range_key["AttributeName"])  # type: ignore
-                    else None
-                )
-        else:
-            results.sort(key=lambda item: item.range_key)  # type: ignore
-
-        if scan_index_forward is False:
-            results.reverse()
-
         results = copy.deepcopy(results)
         if index_name:
             index = self.get_index(index_name)

Hi @mlalevic, thanks for raising this, and welcome to Moto! I think it was already broken in 4.2.14 because of this PR, in an attempt to correct the scan-count: https://github.com/getmoto/moto/pull/7208

I'll try to raise a fix shortly.
diff --git a/tests/test_dynamodb/test_dynamodb.py b/tests/test_dynamodb/test_dynamodb.py
--- a/tests/test_dynamodb/test_dynamodb.py
+++ b/tests/test_dynamodb/test_dynamodb.py
@@ -1386,6 +1386,25 @@ def test_query_filter():
     )
     assert response["Count"] == 2
 
+    # Combine Limit + Scan
+    response = table.query(
+        KeyConditionExpression=Key("client").eq("client1"),
+        Limit=1,
+        ScanIndexForward=False,
+    )
+    assert response["Count"] == 1
+    assert response["ScannedCount"] == 1
+    assert response["Items"][0]["app"] == "app2"
+
+    response = table.query(
+        KeyConditionExpression=Key("client").eq("client1"),
+        Limit=1,
+        ScanIndexForward=True,
+    )
+    assert response["Count"] == 1
+    assert response["ScannedCount"] == 1
+    assert response["Items"][0]["app"] == "app1"
+
 
 @mock_aws
 def test_query_filter_overlapping_expression_prefixes():

DynamoDB query with Limit and ScanIndexForward=False not working as expected in 5.0.0
Looks like there was a change between 4.2.14 and 5.0.0 how DynamoDB queries work when I use Limit and ScanIndexForward=False.

In the test below, the very last assert passes in 4.2.14 but fails in 5.0.0. I am using Limit=1 and ScanIndexForward=False, the expectation is that I get only 1 record with "greatest" value for SK.

There are 4 asserts below - the first two are checking query with ScanIndexForward=True/False and returning all records - that seems to be working fine. But when I introduce Limit=1, the last assert fails.


```python
import boto3
import moto
import pytest
from boto3.dynamodb.conditions import Key

@pytest.mark.unit_test
@moto.mock_aws
class TestReproduceScanIssue:
    def test_scan_not_working(self):
        dynamodb = boto3.resource("dynamodb", region_name="us-east-1")
        my_table = dynamodb.create_table(
            AttributeDefinitions=[
                {"AttributeName": "PK", "AttributeType": "S"},
                {"AttributeName": "SK", "AttributeType": "S"}
            ],
            TableName="my_dummy_table",
            KeySchema=[
                {"AttributeName": "PK", "KeyType": "HASH"},
                {"AttributeName": "SK", "KeyType": "RANGE"}
            ],
            BillingMode="PAY_PER_REQUEST"
        )

        my_table.put_item(Item={ 'PK': "Test", 'SK': "SK1" })
        my_table.put_item(Item={ 'PK': "Test", 'SK': "SK3" })
        my_table.put_item(Item={ 'PK': "Test", 'SK': "SK2" })

        result = my_table.query(
            KeyConditionExpression = Key("PK").eq("Test"),
            ScanIndexForward = True
        )

        sk_from_result = [data['SK'] for data in result['Items']]
        assert sk_from_result == ["SK1", "SK2", "SK3"]

        result = my_table.query(
            KeyConditionExpression = Key("PK").eq("Test"),
            ScanIndexForward = False
        )

        sk_from_result = [data['SK'] for data in result['Items']]
        assert sk_from_result == ["SK3", "SK2", "SK1"]

        result = my_table.query(
            KeyConditionExpression = Key("PK").eq("Test"),
            ScanIndexForward = True,
            Limit = 1,
        )

        sk_from_result = [data['SK'] for data in result['Items']]
        assert sk_from_result == ["SK1"]

        result = my_table.query(
            KeyConditionExpression = Key("PK").eq("Test"),
            ScanIndexForward = False,
            Limit = 1,
        )

        sk_from_result = [data['SK'] for data in result['Items']]
        assert sk_from_result == ["SK3"]
```

Result when using Moto 5.0.0:
```
        assert sk_from_result == ["SK1"]

        result = my_table.query(
            KeyConditionExpression = Key("PK").eq("Test"),
            ScanIndexForward = False,
            Limit = 1,
        )

        sk_from_result = [data['SK'] for data in result['Items']]
>       assert sk_from_result == ["SK3"]
E       AssertionError: assert ['SK1'] == ['SK3']
```

tests/test_dynamodb/test_dynamodb.py::test_query_filter
tests/test_dynamodb/test_dynamodb.py::test_remove_list_index__remove_existing_nested_index tests/test_dynamodb/test_dynamodb.py::test_basic_projection_expressions_using_query_with_attr_expression_names tests/test_dynamodb/test_dynamodb.py::test_describe_backup_for_non_existent_backup_raises_error tests/test_dynamodb/test_dynamodb.py::test_update_item_with_list tests/test_dynamodb/test_dynamodb.py::test_describe_continuous_backups_errors tests/test_dynamodb/test_dynamodb.py::test_describe_missing_table_boto3 tests/test_dynamodb/test_dynamodb.py::test_transact_write_items_delete tests/test_dynamodb/test_dynamodb.py::test_remove_list_index__remove_existing_index tests/test_dynamodb/test_dynamodb.py::test_dynamodb_update_item_fails_on_string_sets tests/test_dynamodb/test_dynamodb.py::test_projection_expression_execution_order tests/test_dynamodb/test_dynamodb.py::test_update_item_with_attribute_in_right_hand_side_and_operation tests/test_dynamodb/test_dynamodb.py::test_transact_write_items_conditioncheck_passes tests/test_dynamodb/test_dynamodb.py::test_basic_projection_expression_using_get_item tests/test_dynamodb/test_dynamodb.py::test_list_table_tags_empty tests/test_dynamodb/test_dynamodb.py::test_create_backup_for_non_existent_table_raises_error tests/test_dynamodb/test_dynamodb.py::test_update_expression_with_plus_in_attribute_name tests/test_dynamodb/test_dynamodb.py::test_scan_filter2 tests/test_dynamodb/test_dynamodb.py::test_describe_backup tests/test_dynamodb/test_dynamodb.py::test_batch_write_item tests/test_dynamodb/test_dynamodb.py::test_transact_write_items_delete_with_successful_condition_expression tests/test_dynamodb/test_dynamodb.py::test_query_invalid_table tests/test_dynamodb/test_dynamodb.py::test_delete_backup tests/test_dynamodb/test_dynamodb.py::test_nested_projection_expression_using_query tests/test_dynamodb/test_dynamodb.py::test_transact_get_items_should_return_empty_map_for_non_existent_item tests/test_dynamodb/test_dynamodb.py::test_update_supports_list_append_maps tests/test_dynamodb/test_dynamodb.py::test_update_item_add_to_num_set_using_legacy_attribute_updates tests/test_dynamodb/test_dynamodb.py::test_update_supports_nested_update_if_nested_value_not_exists tests/test_dynamodb/test_dynamodb.py::test_index_with_unknown_attributes_should_fail tests/test_dynamodb/test_dynamodb.py::test_update_supports_nested_list_append tests/test_dynamodb/test_dynamodb.py::test_update_item_atomic_counter_from_zero tests/test_dynamodb/test_dynamodb.py::test_update_item_if_original_value_is_none tests/test_dynamodb/test_dynamodb.py::test_filter_expression_execution_order tests/test_dynamodb/test_dynamodb.py::test_delete_item tests/test_dynamodb/test_dynamodb.py::test_list_tables_paginated tests/test_dynamodb/test_dynamodb.py::test_query_gsi_with_range_key tests/test_dynamodb/test_dynamodb.py::test_valid_transact_get_items tests/test_dynamodb/test_dynamodb.py::test_describe_continuous_backups tests/test_dynamodb/test_dynamodb.py::test_transact_write_items_failure__return_item tests/test_dynamodb/test_dynamodb.py::test_remove_list_index__remove_existing_double_nested_index tests/test_dynamodb/test_dynamodb.py::test_non_existing_attribute_should_raise_exception tests/test_dynamodb/test_dynamodb.py::test_scan_by_non_exists_index tests/test_dynamodb/test_dynamodb.py::test_update_supports_list_append_with_nested_if_not_exists_operation tests/test_dynamodb/test_dynamodb.py::test_put_empty_item tests/test_dynamodb/test_dynamodb.py::test_gsi_lastevaluatedkey tests/test_dynamodb/test_dynamodb.py::test_query_catches_when_no_filters tests/test_dynamodb/test_dynamodb.py::test_restore_table_to_point_in_time_raises_error_when_dest_exist tests/test_dynamodb/test_dynamodb.py::test_update_supports_complex_expression_attribute_values tests/test_dynamodb/test_dynamodb.py::test_update_expression_with_numeric_literal_instead_of_value tests/test_dynamodb/test_dynamodb.py::test_list_tables_boto3[multiple-tables] tests/test_dynamodb/test_dynamodb.py::test_update_list_index__set_nested_index_out_of_range tests/test_dynamodb/test_dynamodb.py::test_update_nested_item_if_original_value_is_none tests/test_dynamodb/test_dynamodb.py::test_update_supports_multiple_levels_nested_list_append tests/test_dynamodb/test_dynamodb.py::test_list_tables_boto3[one-table] tests/test_dynamodb/test_dynamodb.py::test_put_item_nonexisting_range_key tests/test_dynamodb/test_dynamodb.py::test_list_backups tests/test_dynamodb/test_dynamodb.py::test_query_filter_overlapping_expression_prefixes tests/test_dynamodb/test_dynamodb.py::test_source_and_restored_table_items_are_not_linked tests/test_dynamodb/test_dynamodb.py::test_bad_scan_filter tests/test_dynamodb/test_dynamodb.py::test_update_expression_with_minus_in_attribute_name tests/test_dynamodb/test_dynamodb.py::test_restore_table_from_backup_raises_error_when_table_already_exists tests/test_dynamodb/test_dynamodb.py::test_put_item_nonexisting_hash_key tests/test_dynamodb/test_dynamodb.py::test_restore_table_to_point_in_time_raises_error_when_source_not_exist tests/test_dynamodb/test_dynamodb.py::test_basic_projection_expression_using_get_item_with_attr_expression_names tests/test_dynamodb/test_dynamodb.py::test_invalid_transact_get_items tests/test_dynamodb/test_dynamodb.py::test_update_continuous_backups tests/test_dynamodb/test_dynamodb.py::test_update_item_atomic_counter tests/test_dynamodb/test_dynamodb.py::test_nested_projection_expression_using_query_with_attr_expression_names tests/test_dynamodb/test_dynamodb.py::test_item_add_empty_string_range_key_exception tests/test_dynamodb/test_dynamodb.py::test_get_item_for_non_existent_table_raises_error tests/test_dynamodb/test_dynamodb.py::test_scan_filter tests/test_dynamodb/test_dynamodb.py::test_error_when_providing_expression_and_nonexpression_params tests/test_dynamodb/test_dynamodb.py::test_update_return_attributes tests/test_dynamodb/test_dynamodb.py::test_item_size_is_under_400KB tests/test_dynamodb/test_dynamodb.py::test_multiple_updates tests/test_dynamodb/test_dynamodb.py::test_scan_filter4 tests/test_dynamodb/test_dynamodb.py::test_nested_projection_expression_using_get_item_with_attr_expression tests/test_dynamodb/test_dynamodb.py::test_update_expression_with_space_in_attribute_name tests/test_dynamodb/test_dynamodb.py::test_create_multiple_backups_with_same_name tests/test_dynamodb/test_dynamodb.py::test_gsi_projection_type_keys_only tests/test_dynamodb/test_dynamodb.py::test_update_list_index__set_existing_nested_index tests/test_dynamodb/test_dynamodb.py::test_set_attribute_is_dropped_if_empty_after_update_expression[use tests/test_dynamodb/test_dynamodb.py::test_transact_write_items_put_conditional_expressions tests/test_dynamodb/test_dynamodb.py::test_restore_table_from_non_existent_backup_raises_error tests/test_dynamodb/test_dynamodb.py::test_query_by_non_exists_index tests/test_dynamodb/test_dynamodb.py::test_gsi_key_cannot_be_empty tests/test_dynamodb/test_dynamodb.py::test_remove_list_index__remove_index_out_of_range tests/test_dynamodb/test_dynamodb.py::test_transact_write_items_fails_with_transaction_canceled_exception tests/test_dynamodb/test_dynamodb.py::test_update_if_not_exists tests/test_dynamodb/test_dynamodb.py::test_remove_top_level_attribute tests/test_dynamodb/test_dynamodb.py::test_restore_table_from_backup tests/test_dynamodb/test_dynamodb.py::test_nested_projection_expression_using_scan_with_attr_expression_names tests/test_dynamodb/test_dynamodb.py::test_update_non_existing_item_raises_error_and_does_not_contain_item_afterwards tests/test_dynamodb/test_dynamodb.py::test_allow_update_to_item_with_different_type tests/test_dynamodb/test_dynamodb.py::test_describe_limits tests/test_dynamodb/test_dynamodb.py::test_sorted_query_with_numerical_sort_key tests/test_dynamodb/test_dynamodb.py::test_dynamodb_max_1mb_limit tests/test_dynamodb/test_dynamodb.py::test_update_continuous_backups_errors tests/test_dynamodb/test_dynamodb.py::test_list_backups_for_non_existent_table tests/test_dynamodb/test_dynamodb.py::test_duplicate_create tests/test_dynamodb/test_dynamodb.py::test_summing_up_2_strings_raises_exception tests/test_dynamodb/test_dynamodb.py::test_update_item_atomic_counter_return_values tests/test_dynamodb/test_dynamodb.py::test_put_item_with_special_chars tests/test_dynamodb/test_dynamodb.py::test_query_missing_expr_names tests/test_dynamodb/test_dynamodb.py::test_transact_write_items_update_with_failed_condition_expression tests/test_dynamodb/test_dynamodb.py::test_describe_endpoints[eu-central-1] tests/test_dynamodb/test_dynamodb.py::test_create_backup tests/test_dynamodb/test_dynamodb.py::test_list_tables_boto3[no-table] tests/test_dynamodb/test_dynamodb.py::test_attribute_item_delete tests/test_dynamodb/test_dynamodb.py::test_invalid_projection_expressions tests/test_dynamodb/test_dynamodb.py::test_delete_item_error tests/test_dynamodb/test_dynamodb.py::test_update_list_index__set_existing_index tests/test_dynamodb/test_dynamodb.py::test_nested_projection_expression_using_get_item tests/test_dynamodb/test_dynamodb.py::test_nested_projection_expression_using_scan tests/test_dynamodb/test_dynamodb.py::test_update_item_on_map tests/test_dynamodb/test_dynamodb.py::test_restore_table_to_point_in_time tests/test_dynamodb/test_dynamodb.py::test_transact_write_items_put tests/test_dynamodb/test_dynamodb.py::test_basic_projection_expressions_using_query tests/test_dynamodb/test_dynamodb.py::test_list_not_found_table_tags tests/test_dynamodb/test_dynamodb.py::test_transact_write_items_update tests/test_dynamodb/test_dynamodb.py::test_update_return_updated_new_attributes_when_same tests/test_dynamodb/test_dynamodb.py::test_projection_expression_with_binary_attr tests/test_dynamodb/test_dynamodb.py::test_gsi_verify_negative_number_order tests/test_dynamodb/test_dynamodb.py::test_transact_write_items_conditioncheck_fails tests/test_dynamodb/test_dynamodb.py::test_set_ttl tests/test_dynamodb/test_dynamodb.py::test_scan_filter_should_not_return_non_existing_attributes tests/test_dynamodb/test_dynamodb.py::test_update_supports_list_append tests/test_dynamodb/test_dynamodb.py::test_put_return_attributes tests/test_dynamodb/test_dynamodb.py::test_lsi_projection_type_keys_only tests/test_dynamodb/test_dynamodb.py::test_remove_list_index__remove_multiple_indexes tests/test_dynamodb/test_dynamodb.py::test_update_list_index__set_double_nested_index tests/test_dynamodb/test_dynamodb.py::test_gsi_key_can_be_updated tests/test_dynamodb/test_dynamodb.py::test_put_item_with_streams tests/test_dynamodb/test_dynamodb.py::test_list_tables_exclusive_start_table_name_empty tests/test_dynamodb/test_dynamodb.py::test_update_item_with_no_action_passed_with_list tests/test_dynamodb/test_dynamodb.py::test_update_item_with_empty_string_attr_no_exception tests/test_dynamodb/test_dynamodb.py::test_scan_with_scanfilter tests/test_dynamodb/test_dynamodb.py::test_transact_write_items_delete_with_failed_condition_expression tests/test_dynamodb/test_dynamodb.py::test_basic_projection_expressions_using_scan tests/test_dynamodb/test_dynamodb.py::test_list_table_tags tests/test_dynamodb/test_dynamodb.py::test_update_supports_nested_list_append_onto_another_list tests/test_dynamodb/test_dynamodb.py::test_update_list_index__set_index_out_of_range tests/test_dynamodb/test_dynamodb.py::test_filter_expression tests/test_dynamodb/test_dynamodb.py::test_basic_projection_expressions_using_scan_with_attr_expression_names tests/test_dynamodb/test_dynamodb.py::test_item_add_empty_string_hash_key_exception tests/test_dynamodb/test_dynamodb.py::test_item_add_empty_string_attr_no_exception tests/test_dynamodb/test_dynamodb.py::test_update_item_add_to_non_existent_set tests/test_dynamodb/test_dynamodb.py::test_gsi_projection_type_include tests/test_dynamodb/test_dynamodb.py::test_query_global_secondary_index_when_created_via_update_table_resource tests/test_dynamodb/test_dynamodb.py::test_update_item_add_to_non_existent_number_set tests/test_dynamodb/test_dynamodb.py::test_update_expression_with_multiple_set_clauses_must_be_comma_separated tests/test_dynamodb/test_dynamodb.py::test_scan_filter3 tests/test_dynamodb/test_dynamodb.py::test_update_list_index__set_index_of_a_string tests/test_dynamodb/test_dynamodb.py::test_update_supports_list_append_with_nested_if_not_exists_operation_and_property_already_exists tests/test_dynamodb/test_dynamodb.py::test_describe_endpoints[ap-south-1] tests/test_dynamodb/test_dynamodb.py::test_delete_table tests/test_dynamodb/test_dynamodb.py::test_update_item_add_to_list_using_legacy_attribute_updates tests/test_dynamodb/test_dynamodb.py::test_remove_top_level_attribute_non_existent tests/test_dynamodb/test_dynamodb.py::test_delete_non_existent_backup_raises_error tests/test_dynamodb/test_dynamodb.py::test_update_item_with_attribute_in_right_hand_side tests/test_dynamodb/test_dynamodb.py::test_list_table_tags_paginated