簡體   English   中英

返回表中的所有列,但僅返回特定列不同的行

[英]Return all columns from a table but only return rows where a specific column is distinct

我正在制作各種購物車應用程序,因此,當用戶登錄是否訂購商品時,會OrderNumber分配OrderNumber 當他將物品放入購物車時,訂單將存儲在數據庫中,如下所示:

+---+------------+-----------+------------+
|num|CustomerItem|OrderNumber|CustomerName|
+---+------------+-----------+------------+
|1  |Candles     |12         |Dorothy     |
+---+------------+-----------+------------+
|2  |Keyboard    |11         |Kirk        |
+---+------------+-----------+------------+
|3  |Lotion      |12         |Dorothy     |
+---+------------+-----------+------------+
|4  |Monitor     |11         |Kirk        |
+---+------------+-----------+------------+
|5  |Cups        |13         |Kathy       |
+---+------------+-----------+------------+

現在,這是我想返回的

+---+------------+-----------+------------+
|num|CustomerItem|OrderNumber|CustomerName|
+---+------------+-----------+------------+
|4  |Monitor     |11         |Kirk        |
+---+------------+-----------+------------+
|1  |Candles     |12         |Dorothy     |
+---+------------+-----------+------------+
|5  |Cups        |13         |Kathy       |
+---+------------+-----------+------------+

這些語句是我嘗試過的:

select * from [mytable] where
[OrderNumber] in (Select max(OrderNumber) FROM [mytable] group by OrderNum)

select * from [mytable] where
[OrderNumber] in (Select Distinct OrderNumber FROM [mytable] group by OrderNum)

這兩個語句都不起作用,它們都在OrderNumber列中顯示重復項

您可能想嘗試類似的方法:

SELECT * 
FROM [mytable]
WHERE ([OrderNumber], num) IN (
    SELECT OrderNumber, max(Numb) 
    FROM [mytable] 
    GROUP BY OrderNum
)

我認為您正在尋找與眾不同的http://www.w3schools.com/sql/sql_distinct.asp

select distinct customeritem ,ordernnumber,customername
from [mytable] 

這將列出所有訂購的物品。 您將以這種方式釋放num(PK)列,但沒有真正的方法來獲得它,因為它將是唯一的,因此不會重復。 您可以添加一個group by和一個count(*)以獲取他們訂購的數量

如果您想要特定OrderNumber具有最高num值的行(這與您的預期結果不符,但您尚未闡明規則),則:

; With Ordered as (
 Select *,
 ROW_NUMBER() OVER (PARTITION BY OrderNum
                    ORDER BY num desc) as rn
 FROM [mytable]
)
select * from Ordered where rn = 1

看到ROW_NUMBER

由於每個OrderNumber的每一行的CustomerName都相同,因此您需要制定一條規則來確定將返回哪個NumCustomerItem

但是,查看所需的樣本輸出后,您將為每個樣本使用不同的邏輯規則。

例:

[Num]        [CustomerItem]      [OrderNumber]       [CustomerName]
1            Candles             12                  Dorothy
2            Keyboard            11                  Kirk
3            Lotion              12                  Dorothy
4            Monitor             11                  Kirk

您想返回這兩個:

4            Monitor             11                  Kirk    
1            Candles             12                  Dorothy

現在,對於Monitor ,Num和CustomerItem都以降序表示第一個結果,無論您使用哪個字段對其進行排序。 對於Candles ,Num和CustomerItem均表示升序。 因此,可能還有其他原因導致我們不知道訂購的順序,或者您要的是不合邏輯的。

否則,您可以簡單地執行以下操作:

select DISTINCT CA.*
from [mytable] MT
CROSS APPLY (SELECT TOP 1 * FROM mytable T2 WHERE T2.OrderNumber = MT.OrderNumber ORDER BY T2.Num asc) CA

它將為每組OrderNumbers返回第一行,按Num排序。 對於較大的表,將myTable聯接到具有GROUP BY OrderNumber和MAX(Num)的子查詢,使用這兩個作為聯接值,將創建相同的結果,但效率更高。

暫無
暫無

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

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