C# sql查询以列出不带groupby/aggregate的列

C# sql查询以列出不带groupby/aggregate的列,c#,sql,sql-server,tsql,C#,Sql,Sql Server,Tsql,我的两张桌子看起来像这样 工作台 buyer timeArrived billed paid ABC 2013-02-08 10:30:00 60$ 45$ CTS 2013-02-18 10:30:00 100$ 80$ ABC 2012-03-11 10:30:00 60$ 40$ MNT 2012-02-08 10:30:00 1

我的两张桌子看起来像这样

工作台

buyer   timeArrived               billed     paid

ABC     2013-02-08 10:30:00       60$        45$
CTS     2013-02-18 10:30:00       100$       80$
ABC     2012-03-11 10:30:00       60$        40$
MNT     2012-02-08 10:30:00       100$       60$
CTS     2012-03-11 10:30:00       60$        40$
买方表格

buyer

ABC
MNT
CTS
GH
为了在买家“最后一次露面”时搜索他,我从买家表查询到商店表 像

知道ABC和CTS什么时候购物很好 但是如何获得“账单”和“付费”列呢

SELECT
 b.buyer,
 s.*
FROM buyer_t AS b
INNER JOIN shop as s ON b.buyer = s.buyer
INNER JOIN
(
   SELECT buyer, MAX(timeArrived) AS LastSeen
   FROM shop
   GROUP BY buyer
) AS s2  ON s.buyer = s2.buyer
        AND s.timeArrived = s2.lastSeen
WHERE s.buyer IN ('ABC', 'CTS');
这将为您提供:

| BUYER |                     TIMEARRIVED | BILLED | PAID |
-----------------------------------------------------------
|   ABC | February, 08 2013 10:30:00+0000 |    60$ |  45$ |
|   CTS | February, 18 2013 10:30:00+0000 |   100$ |  80$ |

或:由于您使用的是SQL Server 2005,因此您可以使用(
ROW_NUMBER())OVER(partitionby…ORDER BY…)来执行以下操作:

WITH CTE
AS
(
    SELECT
      s.*,
      ROW_NUMBER() OVER(PARTITION BY s.buyer
                        ORDER BY timeArrived DESC) AS Rownumber
    FROM buyer_t AS b
    INNER JOIN shop as s ON b.buyer = s.buyer
    WHERE s.buyer IN ('ABC', 'CTS')
) 
SELECT Buyer, TimeArrived, Billed, Paid
FROM CTE 
WHERE Rownumber = 1;
请尝试以下方法:

SELECT
 b.buyer,
 s.*
FROM buyer_t AS b
INNER JOIN shop as s ON b.buyer = s.buyer
INNER JOIN
(
   SELECT buyer, MAX(timeArrived) AS LastSeen
   FROM shop
   GROUP BY buyer
) AS s2  ON s.buyer = s2.buyer
        AND s.timeArrived = s2.lastSeen
WHERE s.buyer IN ('ABC', 'CTS');
这将为您提供:

| BUYER |                     TIMEARRIVED | BILLED | PAID |
-----------------------------------------------------------
|   ABC | February, 08 2013 10:30:00+0000 |    60$ |  45$ |
|   CTS | February, 18 2013 10:30:00+0000 |   100$ |  80$ |

或:由于您使用的是SQL Server 2005,因此您可以使用(
ROW_NUMBER())OVER(partitionby…ORDER BY…)来执行以下操作:

WITH CTE
AS
(
    SELECT
      s.*,
      ROW_NUMBER() OVER(PARTITION BY s.buyer
                        ORDER BY timeArrived DESC) AS Rownumber
    FROM buyer_t AS b
    INNER JOIN shop as s ON b.buyer = s.buyer
    WHERE s.buyer IN ('ABC', 'CTS')
) 
SELECT Buyer, TimeArrived, Billed, Paid
FROM CTE 
WHERE Rownumber = 1;

@user1944477查询中没有
v
别名,请尝试
s.buyer
b.buyer
。@user1944477是的,它为您设置了最近的日期,最大日期是最近的日期。@user1944477没问题,这是正确的。如果有什么问题,请随时再次询问。如果你觉得有帮助,试着去做。当然,但我不能接受答案。它不接受,显示4,但返回到3..:(@user1944477没问题,这是Stackoverflow中的工作方式:)@user1944477在您的查询中没有
v
别名,请尝试
s.buyer
b.buyer
。@user1944477是的,它将您划分为最近的日期,最大日期是最近的日期。@user1944477没问题,这是正确的。如果有什么问题,请随时再次询问。如果你觉得有帮助,试着去做。当然,但我不能接受答案。它不接受,显示4,但返回到3..:(@user1944477没关系,这是Stackoverflow中的工作原理:)